プラットフォーム SDK
NetUserGetLocalGroups
指定されたユーザーが所属している、すべてのローカルグループのリストを取得します。
セキュリティの要件
Windows NT:Authenticated Users グループのメンバだけがこの関数を実行できます。
Windows 2000:Active Directory が動作している Windows 2000 ドメインコントローラでこの関数を実行すると、セキュリティで保護することが可能なオブジェクトの ACL(アクセス制御リスト)に基づいて、アクセスが許可または拒否されます。既定の ACL は、Authenticated Users または Pre-Windows 2000 Compatible Access グループのメンバだけが情報を表示することを許可します。既定では、Everyone グループが、Pre-Windows 2000 Compatible Access グループのメンバになっています。この結果、システムが匿名(アノニマス)アクセスを許可している場合、情報への匿名アクセスができます。
Windows 2000 のメンバサーバーまたはワークステーションで開発者がこの関数を実行すると、Authenticated Users グループのすべてのメンバが情報を表示できるようになります。レジストリの HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Lsa ハイブで restrictanonymous エントリに 1 を割り当てると、匿名アクセスを許可するポリシーが設定されます。
匿名アクセスに制限を加える方法については、MSDN ライブラリの「」を参照してください。
NET_API_STATUS NetUserGetLocalGroups(
LPCWSTR servername, // 実行対象のリモートサーバー
LPCWSTR username, // 所属ローカルグループを取得するべきユーザー
DWORD level, // 情報レベル
DWORD flags, // フラグ
LPBYTE *bufptr, // 情報が格納されるバッファ
DWORD prefmaxlen, // バッファの最大サイズ
LPDWORD entriesread, // 格納されたエントリの数
LPDWORD totalentries // 利用可能なエントリの総数
);
パラメータ
- servername
- この関数を実行するリモートサーバーの名前を表す、Unicode 文字列へのポインタを指定します。この文字列の先頭は "\\" でなければなりません。このパラメータが NULL の場合、ローカルコンピュータを使います。
- username
- グローバルグループメンバーシップを取得するべき(各グループ内で検索するべき)ユーザーの名前を表す、Unicode 文字列へのポインタを指定します。この文字列が DomainName\UserName 形式である場合、そのドメイン内でユーザー名が見つかることを期待できます。この文字列が UserName 形式である場合、servername パラメータで指定したサーバー内でユーザー名が見つかることを期待できます。
- level
- データの情報レベルを指定します。このパラメータは、次の値を取ります。
| 値 | 意味 |
| 0 | ユーザーが所属しているすべてのローカルグループの名前を取得します。関数から制御が返ると、bufptr パラメータが指すバッファに、複数の 構造体からなる 1 つの配列が格納されます。 |
- flags
- フラグのビットマスクを指定します。現在、LG_INCLUDE_INDIRECT だけが定義されています。このビットがセットされている場合、この関数はユーザーが間接的に所属しているローカルグループ(つまり、あるグローバルグループに所属しているユーザーは、1 つまたは複数のローカルグループに所属していることになります)も返します。
- bufptr
- 1 個のバッファへのポインタを指定します。関数から制御が返ると、このバッファに、指定したデータが格納されます。このデータの形式は、level パラメータの値によって異なります。このバッファはシステムによって割り当てられたものであり、NetApiBufferFree 関数を使って解放しなければなりません。この関数が失敗して ERROR_MORE_DATA が返った場合でも、このバッファを解放しなければならないことに注意してください。
- prefmaxlen
- 取得するべきデータの最大の長さ(上限)をバイト単位で指定します。このパラメータが MAX_PREFERRED_LENGTH の場合、データが必要とする量のメモリを割り当てます。このパラメータで他の値を指定すると、その値は、この関数が返すバイト数に制限を加えることがあります。バッファサイズが不足して一部のエントリを格納できない場合は、ERROR_MORE_DATA が返ります。詳細については、MSDN ライブラリの「」と「」を参照してください。
- entriesread
- 1 つの DWORD 値へのポインタを指定します。関数から制御が返ると、この値に、実際に取得した要素の数が格納されます。
- totalentries
- 1 つの DWORD 値へのポインタを指定します。関数から制御が返ると、この値に、取得できるはずのエントリの総数が格納されます。
戻り値
関数が成功すると、NERR_Success が返ります。
関数が失敗すると、次のエラーコードのいずれかが返ります。
| 値 | 意味 |
| ERROR_ACCESS_DENIED | ユーザーには、要求した情報へのアクセス権がありません。 |
| ERROR_MORE_DATA | より多くのエントリが利用可能です。すべてのエントリを格納するのに十分な大きさのバッファを指定してください。 |
| NERR_InvalidComputer | コンピュータ名が無効です。 |
| NERR_UserNotFound | 指定されたユーザー名が見つかりませんでした。 |
解説
指定したユーザーが所属している、すべてのグローバルグループのリストを取得するには、NetUserGetGroups 関数を呼び出します。
次のサンプルコードは、NetUserGetLocalGroups 関数を呼び出して、1 人のユーザーが所属しているすべてのローカルグループを取得する方法を示します。このサンプルは、情報レベル 0()を指定して NetUserGetLocalGroups 関数を呼び出します。各エントリをループ処理し、ユーザーのメンバーシップが存在する(ユーザーが所属している)各ローカルグループの名前を出力します。また、利用可能なエントリの一部が列挙されていない場合、実際に列挙したエントリの数と、利用可能なエントリの総数も出力します。最後に、このサンプルは、情報バッファへ割り当てたメモリを解放します。
#ifndef UNICODE
#define UNICODE
#endif
#include <stdio.h>
#include <assert.h>
#include <windows.h>
#include <lm.h>
int wmain(int argc, wchar_t *argv[])
{
LPLOCALGROUP_USERS_INFO_0 pBuf = NULL;
DWORD dwLevel = 0;
DWORD dwFlags = LG_INCLUDE_INDIRECT ;
DWORD dwPrefMaxLen = -1;
DWORD dwEntriesRead = 0;
DWORD dwTotalEntries = 0;
NET_API_STATUS nStatus;
if (argc != 3)
{
fwprintf(stderr, L"Usage: %s \\\\ServerName UserName\n", argv[0]);
exit(1);
}
//
// 情報レベル 0 を指定して、
// NetUserGetLocalGroups 関数を呼び出す。
//
// LG_INCLUDE_INDIRECT フラグを指定すると、
// ユーザーが間接的にメンバになっているグループも
// 列挙するよう、この関数に指示することになる。
//
nStatus = NetUserGetLocalGroups(argv[1],
argv[2],
dwLevel,
dwFlags,
(LPBYTE *) &pBuf,
dwPrefMaxLen,
&dwEntriesRead,
&dwTotalEntries);
//
// 呼び出しが成功した場合、
//
if (nStatus == NERR_Success)
{
LPLOCALGROUP_USERS_INFO_0 pTmpBuf;
DWORD i;
DWORD dwTotalCount = 0;
if ((pTmpBuf = pBuf) != NULL)
{
fprintf(stderr, "\nLocal group(s):\n");
//
// 各エントリをループ処理し、
// ユーザーが所属している
// 各ローカルグループの名前を出力する。
//
for (i = 0; i <dwEntriesRead; i++)
{
assert(pTmpBuf != NULL);
if (pTmpBuf == NULL)
{
fprintf(stderr, "An access violation has occurred\n");
break;
}
wprintf(L"\t-- %s\n", pTmpBuf->lgrui0_name);
pTmpBuf++;
dwTotalCount++;
}
}
//
// 利用可能なエントリの一部が列挙されていない場合、
// 実際に列挙されたエントリの数と、
// 利用可能なエントリの総数を出力する。
//
if (dwEntriesRead <dwTotalEntries)
fprintf(stderr, "\nTotal entries: %d", dwTotalEntries);
//
// それ以外の場合、総数だけを出力する。
//
printf("\nEntries enumerated: %d\n", dwTotalCount);
}
else
fprintf(stderr, "A system error has occurred: %d\n", nStatus);
//
// 割り当て済みのメモリを解放する。
//
if (pBuf != NULL)
NetApiBufferFree(pBuf);
return 0;
}
Active Directory 関連のプログラミングを行っている場合、ADSI(Active Directory Service Interface)の特定の関数を呼び出して、ネットワーク管理のユーザー関数と同様の機能を果たすこともできます。詳細については、MSDN ライブラリの IADsUser と IADsComputer を参照してください。
対応情報
Windows NT/2000:Windows NT 3.1 以降
Windows 95/98:対応していません
ヘッダー:Lmaccess.h 内で宣言、Lm.h をインクルード
インポートライブラリ:Netapi32.lib を使用
参照
NetUserGetGroups,