NetUserGetGroups 関数 (lmaccess.h)

NetUserGetGroups 関数は、指定したユーザーが属するグローバル グループの一覧を取得します。

構文

NET_API_STATUS NET_API_FUNCTION NetUserGetGroups(
  [in]  LPCWSTR servername,
  [in]  LPCWSTR username,
  [in]  DWORD   level,
  [out] LPBYTE  *bufptr,
  [in]  DWORD   prefmaxlen,
  [out] LPDWORD entriesread,
  [out] LPDWORD totalentries
);

パラメーター

[in] servername

関数を実行するリモート サーバーの DNS または NetBIOS 名を指定する定数文字列へのポインター。 このパラメーターが NULL の場合は、ローカル コンピューターが使用されます。

[in] username

各グループ アカウントで検索するユーザーの名前を指定する定数文字列へのポインター。 詳細については、「解説」を参照してください。

[in] level

要求されたデータの情報レベル。 このパラメーターには、次の値のいずれかを指定できます。

説明
0
ユーザーが属するグローバル グループの名前を返します。 bufptr パラメーターは、GROUP_USERS_INFO_0構造体の配列を指します。
1
ユーザーが属性と共に属しているグローバル グループの名前を返します。 bufptr パラメーターは、GROUP_USERS_INFO_1構造体の配列を指します。

[out] bufptr

データを受信するバッファーへのポインター。 このバッファーはシステムによって割り当てられ、 NetApiBufferFree 関数を使用して解放する必要があります。 関数が ERROR_MORE_DATA で失敗した場合でも、バッファーを解放する必要があることに注意してください。

[in] prefmaxlen

返されるデータの推奨される最大長 (バイト単位)。 MAX_PREFERRED_LENGTHが指定されている場合、関数はデータに必要なメモリ量を割り当てます。 このパラメーターに別の値を指定すると、関数から返されるバイト数を制限できます。 バッファー サイズが不十分で、すべてのエントリを保持できる場合、関数は ERROR_MORE_DATAを返します。 詳細については、「 ネットワーク管理機能バッファー 」および「 ネットワーク管理機能バッファーの長さ」を参照してください。

[out] entriesread

実際に取得された要素の数を受け取る値へのポインター。

[out] totalentries

取得された可能性のあるエントリの合計数を受け取る値へのポインター。

戻り値

関数が成功した場合、戻り値はNERR_Success。

関数が失敗した場合、戻り値には次のいずれかのエラー コードを指定できます。

リターン コード 説明
ERROR_ACCESS_DENIED
ユーザーは、要求された情報へのアクセス権を持っていません。
ERROR_BAD_NETPATH
ネットワーク パスが見つかりませんでした。 このエラーは、 servername パラメーターが見つからなかった場合に返されます。
ERROR_INVALID_LEVEL
システム コール レベルが正しくありません。 level パラメーターが 0 または 1 以外の値として指定されている場合、このエラーが返されます。
ERROR_INVALID_NAME
名前の構文が正しくありません。 このエラーは、 servername パラメーターの先頭または末尾に空白が含まれているか、無効な文字が含まれている場合に返されます。
ERROR_MORE_DATA
その他のエントリを使用できます。 すべてのエントリを受信するのに十分な大きさのバッファーを指定します。
ERROR_NOT_ENOUGH_MEMORY
操作を完了するために使用できるメモリが不足していました。
NERR_InternalError
内部エラーが発生しました。
NERR_UserNotFound
ユーザーが見つかりませんでした。 このエラーは、 ユーザー名 が見つからなかった場合に返されます。

解説

Active Directory のプログラミングを行う場合は、特定の Active Directory サービス インターフェイス (ADSI) メソッドを呼び出して、ネットワーク管理ユーザー関数を呼び出すことで実現できるのと同じ機能を実現できる場合があります。 詳細については、「 IADsUserIADsComputer」を参照してください。

Active Directory を実行しているドメイン コントローラーでこの関数を呼び出すと、 セキュリティ保護可能なオブジェクトのアクセス制御リスト (ACL) に基づいてアクセスが許可または拒否されます。 既定の ACL では、"Pre-Windows 2000 互換アクセス" グループのすべての認証済みユーザーとメンバーに情報の表示が許可されます。 メンバー サーバーまたはワークステーションでこの関数を呼び出すと、すべての認証済みユーザーが情報を表示できます。 これらのプラットフォームでの匿名アクセスと匿名アクセスの制限については、「 ネットワーク管理機能のセキュリティ要件」を参照してください。 ACL、ACE、およびアクセス トークンの詳細については、「存取控制 モデル」を参照してください。

User オブジェクトのセキュリティ記述子は、この関数のアクセスチェックを実行するために使用されます。

ユーザーが属するローカル グループの一覧を取得するには、 NetUserGetLocalGroups 関数を呼び出します。 ネットワーク グループは、Windows NT システム グループとは異なります。

ユーザー アカウント名は 20 文字に制限され、グループ名は 256 文字に制限されます。 さらに、アカウント名をピリオドで終えることはできません。また、コンマまたは"、/、、[、]、:、|<>、+、=、;、?、*のいずれかの印刷可能な文字を含めることはできません。 名前には、印刷できない 1 から 31 の範囲の文字を含めることもできます。

次のコード サンプルでは、 NetUserGetGroups 関数の呼び出しを使用して、ユーザーが属するグローバル グループの一覧を取得する方法を示します。 このサンプルでは、情報レベル 0 ( GROUP_USERS_INFO_0) を指定して NetUserGetGroups を呼び出します。 このコードはエントリをループ処理し、ユーザーがメンバーシップを持つグローバル グループの名前を出力します。 また、このサンプルでは、使用可能なエントリの合計数と、一致しない場合に実際に列挙されたエントリの数も出力されます。 最後に、このコード サンプルでは、バッファーに割り当てられたメモリを解放します。

#ifndef UNICODE
#define UNICODE
#endif
#pragma comment(lib, "netapi32.lib")

#include <stdio.h>
#include <assert.h>
#include <windows.h> 
#include <lm.h>

int wmain(int argc, wchar_t *argv[])
{
   LPGROUP_USERS_INFO_0 pBuf = NULL;
   DWORD dwLevel = 0;
   DWORD dwPrefMaxLen = MAX_PREFERRED_LENGTH;
   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);
   }
   //
   // Call the NetUserGetGroups function, specifying level 0.
   //
   nStatus = NetUserGetGroups(argv[1],
                              argv[2],
                              dwLevel,
                              (LPBYTE*)&pBuf,
                              dwPrefMaxLen,
                              &dwEntriesRead,
                              &dwTotalEntries);
   //
   // If the call succeeds,
   //
   if (nStatus == NERR_Success)
   {
      LPGROUP_USERS_INFO_0 pTmpBuf;
      DWORD i;
      DWORD dwTotalCount = 0;

      if ((pTmpBuf = pBuf) != NULL)
      {
         fprintf(stderr, "\nGlobal group(s):\n");
         //
         // Loop through the entries; 
         //  print the name of the global groups 
         //  to which the user belongs.
         //
         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->grui0_name);

            pTmpBuf++;
            dwTotalCount++;
         }
      }
      //
      // If all available entries were
      //  not enumerated, print the number actually 
      //  enumerated and the total number available.
      //
      if (dwEntriesRead < dwTotalEntries)
         fprintf(stderr, "\nTotal entries: %d", dwTotalEntries);
      //
      // Otherwise, just print the total.
      //
      printf("\nEntries enumerated: %d\n", dwTotalCount);
   }
   else
      fprintf(stderr, "A system error has occurred: %d\n", nStatus);
   //
   // Free the allocated buffer.
   //
   if (pBuf != NULL)
      NetApiBufferFree(pBuf);

   return 0;
}

要件

   
サポートされている最小のクライアント Windows 2000 Professional [デスクトップ アプリのみ]
サポートされている最小のサーバー Windows 2000 Server [デスクトップ アプリのみ]
対象プラットフォーム Windows
ヘッダー lmaccess.h (include Lm.h)
Library Netapi32.lib
[DLL] Netapi32.dll

関連項目

GROUP_USERS_INFO_0

GROUP_USERS_INFO_1

NetGroupGetUsers

NetQueryDisplayInformation

NetUserGetInfo

NetUserGetLocalGroups

ネットワーク管理機能

ネットワーク管理の概要

ユーザー関数