NetUserEnum 関数 (lmaccess.h)

NetUserEnum 関数は、サーバー上のすべてのユーザー アカウントに関する情報を取得します。

構文

NET_API_STATUS NET_API_FUNCTION NetUserEnum(
  [in]      LPCWSTR servername,
  [in]      DWORD   level,
  [in]      DWORD   filter,
  [out]     LPBYTE  *bufptr,
  [in]      DWORD   prefmaxlen,
  [out]     LPDWORD entriesread,
  [out]     LPDWORD totalentries,
  [in, out] PDWORD  resume_handle
);

パラメーター

[in] servername

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

[in] level

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

意味
0
ユーザー アカウント名を返します。 bufptr パラメーターは、USER_INFO_0構造体の配列を指します。
1
ユーザー アカウントに関する詳細情報を返します。 bufptr パラメーターは、USER_INFO_1構造体の配列を指します。
2
承認レベルやログオン情報など、ユーザー アカウントに関する詳細情報を返します。 bufptr パラメーターは、USER_INFO_2構造体の配列を指します。
3
承認レベル、ログオン情報、ユーザーとプライマリ グループの RID、プロファイル情報など、ユーザー アカウントに関する詳細情報を返します。 bufptr パラメーターは、USER_INFO_3構造体の配列を指します。
"10"
ユーザー名とアカウント名とコメントを返します。 bufptr パラメーターは、USER_INFO_10構造体の配列を指します。
11
ユーザー アカウントに関する詳細情報を返します。 bufptr パラメーターは、USER_INFO_11構造体の配列を指します。
20
ユーザーの名前と識別子、およびさまざまなアカウント属性を返します。 bufptr パラメーターは、USER_INFO_20構造体の配列を指します。 Windows XP 以降では、代わりに USER_INFO_23 を使用することをお勧めします。

[in] filter

列挙に含めるユーザー アカウントの種類を指定する 値。 値 0 は、すべての通常のユーザー、信頼データ、およびマシン アカウント データを含める必要があることを示します。

このパラメーターには、次の値を組み合わせることもできます。

意味
FILTER_TEMP_DUPLICATE_ACCOUNT
プライマリ アカウントが別のドメインにあるユーザーのアカウント データを列挙します。 このアカウントの種類は、このドメインへのユーザー アクセスを提供しますが、このドメインを信頼するドメインにはアクセスできません。 ユーザー マネージャーは、このアカウントの種類をローカル ユーザー アカウントと呼びます。
FILTER_NORMAL_ACCOUNT
通常のユーザー アカウント データを列挙します。 このアカウントの種類は、一般的なユーザーに関連付けられています。
FILTER_INTERDOMAIN_TRUST_ACCOUNT
ドメイン間信頼アカウント データを列挙します。 このアカウントの種類は、他のドメインを信頼するドメインの信頼アカウントに関連付けられています。
FILTER_WORKSTATION_TRUST_ACCOUNT
ワークステーションまたはメンバー サーバーの信頼アカウント データを列挙します。 このアカウントの種類は、ドメインのメンバーであるコンピューターのコンピューター アカウントに関連付けられています。
FILTER_SERVER_TRUST_ACCOUNT
メンバー サーバー のマシン アカウント データを列挙します。 このアカウントの種類は、ドメインのメンバーであるバックアップ ドメイン コントローラーのコンピューター アカウントに関連付けられます。

[out] bufptr

データを受信するバッファーへのポインター。 このデータの形式は、 level パラメーターの値によって異なります。

このデータのバッファーはシステムによって割り当てられ、アプリケーションは NetApiBufferFree 関数を呼び出して、返されるデータが不要になったときに割り当てられたメモリを解放する必要があります。 netUserEnum 関数が ERROR_MORE_DATA で失敗した場合でも、バッファーを解放する必要があることに注意してください。

[in] prefmaxlen

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

[out] entriesread

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

[out] totalentries

現在の再開位置から列挙された可能性のあるエントリの合計数を受け取る値へのポインター。 アプリケーションでは、この値のみをヒントとして考慮する必要があることに注意してください。 アプリケーションが Windows 2000 以降のドメイン コントローラーと通信している場合は、 ADSI LDAP プロバイダー を使用して、この種類のデータをより効率的に取得することを検討する必要があります。 ADSI LDAP プロバイダーは、さまざまな ADSI インターフェイスをサポートする ADSI オブジェクトのセットを実装します。 詳細については、「 ADSI サービス プロバイダー」を参照してください。

LAN マネージャー: LAN Manager 2 を実行しているコンピューターを呼び出す場合。xtotalentries パラメーターは、再開シーケンス内のどこにあっても、データベース内のエントリの合計数を常に反映します。

[in, out] resume_handle

既存のユーザー検索を続行するために使用される再開ハンドルを含む値へのポインター。 最初の呼び出しではハンドルを 0 にし、後続の呼び出しでは変更せずに残す必要があります。 このパラメーターが NULL の場合、再開ハンドルは格納されません。

戻り値

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

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

リターン コード 説明
ERROR_ACCESS_DENIED
ユーザーには、要求された情報へのアクセス権がありません。
ERROR_INVALID_LEVEL
システム コール レベルが正しくありません。 level パラメーターがサポートされていない値に設定されている場合、このエラーが返されます。
NERR_BufTooSmall
バッファーが小さすぎてエントリを含められません。 バッファーに情報が書き込まれなかった。
NERR_InvalidComputer
コンピューター名が無効です。
ERROR_MORE_DATA
その他のエントリを使用できます。 すべてのエントリを受信するのに十分な大きさのバッファーを指定します。

注釈

NetUserEnum 関数は、指定されたリモート サーバーまたはローカル コンピューター上のすべてのユーザー アカウントに関する情報を取得します。

NetQueryDisplayInformation 関数を使用すると、ユーザー インターフェイス に表示するユーザー、コンピューター、またはグローバル グループ のアカウント情報をすばやく列挙できます。

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

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

NetUserEnum 関数は、呼び出し元が読み取りアクセス権を持つ情報のみを返します。 呼び出し元は、Domain オブジェクトへのリスト コンテンツ アクセス権と、システム コンテナーにある SAM サーバー オブジェクトに対する SAM ドメイン全体のアクセス権を列挙する必要があります。

LsaEnumerateTrustedDomains または LsaEnumerateTrustedDomainsEx 関数を使用すると、ローカル セキュリティ機関 (LSA) ポリシー オブジェクトによって信頼されるドメインの名前と SID を取得できます。

NetUserEnum 関数は、すべてのシステム ユーザーを返すわけではありません。 NetUserAdd 関数の呼び出しで追加されたユーザーのみが返されます。 ユーザーの一覧が並べ替えられた順序で返される保証はありません。

NetUserEnum 関数を呼び出し、level パラメーターに情報レベル 1、2、または 3 を指定すると、取得される各構造体のパスワード メンバーは NULL に設定され、パスワードのセキュリティが維持されます。

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

NetUserEnum 関数では、レベル パラメーター 4 と USER_INFO_4 構造体はサポートされていません。 NetUserGetInfo 関数は、レベル パラメーター 4 とUSER_INFO_4構造体をサポートしています。

次のコード サンプルは、 NetUserEnum 関数を呼び出してサーバー上のユーザー アカウントに関する情報を取得する方法を示しています。 このサンプルでは NetUserEnum を呼び出し、情報レベル 0 (USER_INFO_0) を指定してグローバル ユーザー アカウントのみを列挙します。 呼び出しが成功した場合、コードはエントリをループ処理し、各ユーザー アカウントの名前を出力します。 最後に、コード サンプルは、情報バッファーに割り当てられたメモリを解放し、列挙されたユーザーの合計を出力します。

#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[])
{
   LPUSER_INFO_0 pBuf = NULL;
   LPUSER_INFO_0 pTmpBuf;
   DWORD dwLevel = 0;
   DWORD dwPrefMaxLen = MAX_PREFERRED_LENGTH;
   DWORD dwEntriesRead = 0;
   DWORD dwTotalEntries = 0;
   DWORD dwResumeHandle = 0;
   DWORD i;
   DWORD dwTotalCount = 0;
   NET_API_STATUS nStatus;
   LPTSTR pszServerName = NULL;

   if (argc > 2)
   {
      fwprintf(stderr, L"Usage: %s [\\\\ServerName]\n", argv[0]);
      exit(1);
   }
   // The server is not the default local computer.
   //
   if (argc == 2)
      pszServerName =  (LPTSTR) argv[1];
   wprintf(L"\nUser account on %s: \n", pszServerName);
   //
   // Call the NetUserEnum function, specifying level 0; 
   //   enumerate global user account types only.
   //
   do // begin do
   {
      nStatus = NetUserEnum((LPCWSTR) pszServerName,
                            dwLevel,
                            FILTER_NORMAL_ACCOUNT, // global users
                            (LPBYTE*)&pBuf,
                            dwPrefMaxLen,
                            &dwEntriesRead,
                            &dwTotalEntries,
                            &dwResumeHandle);
      //
      // If the call succeeds,
      //
      if ((nStatus == NERR_Success) || (nStatus == ERROR_MORE_DATA))
      {
         if ((pTmpBuf = pBuf) != NULL)
         {
            //
            // Loop through the entries.
            //
            for (i = 0; (i < dwEntriesRead); i++)
            {
               assert(pTmpBuf != NULL);

               if (pTmpBuf == NULL)
               {
                  fprintf(stderr, "An access violation has occurred\n");
                  break;
               }
               //
               //  Print the name of the user account.
               //
               wprintf(L"\t-- %s\n", pTmpBuf->usri0_name);

               pTmpBuf++;
               dwTotalCount++;
            }
         }
      }
      //
      // Otherwise, print the system error.
      //
      else
         fprintf(stderr, "A system error has occurred: %d\n", nStatus);
      //
      // Free the allocated buffer.
      //
      if (pBuf != NULL)
      {
         NetApiBufferFree(pBuf);
         pBuf = NULL;
      }
   }
   // Continue to call NetUserEnum while 
   //  there are more entries. 
   // 
   while (nStatus == ERROR_MORE_DATA); // end do
   //
   // Check again for allocated memory.
   //
   if (pBuf != NULL)
      NetApiBufferFree(pBuf);
   //
   // Print the final count of users enumerated.
   //
   fprintf(stderr, "\nTotal of %d entries enumerated\n", dwTotalCount);

   return 0;
}

要件

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

こちらもご覧ください

LsaEnumerateTrustedDomains

LsaEnumerateTrustedDomainsEx

NetQueryDisplayInformation

NetUserAdd

NetUserGetGroups

NetUserGetInfo

ネットワーク管理機能

ネットワーク管理の概要

USER_INFO_0

USER_INFO_1

USER_INFO_10

USER_INFO_11

USER_INFO_2

USER_INFO_20

USER_INFO_23

USER_INFO_3

ユーザー関数