NetWkstaUserEnum 関数 (lmwksta.h)
NetWkstaUserEnum 関数は、ワークステーションに現在ログオンしているすべてのユーザーに関する情報を一覧表示します。 この一覧には、対話型ログオン、サービス ログオン、バッチ ログオンが含まれます。
構文
NET_API_STATUS NET_API_FUNCTION NetWkstaUserEnum(
[in] LMSTR servername,
[in] DWORD level,
[out] LPBYTE *bufptr,
[in] DWORD prefmaxlen,
[out] LPDWORD entriesread,
[out] LPDWORD totalentries,
[in, out] LPDWORD resumehandle
);
パラメーター
[in] servername
関数を実行するリモート サーバーの DNS または NetBIOS 名を指定する文字列へのポインター。 このパラメーターが NULL の場合は、ローカル コンピューターが使用されます。
[in] level
データの情報レベルを指定します。 このパラメーターには、次の値のいずれかを指定できます。
値 | 意味 |
---|---|
|
ワークステーションに現在ログオンしているユーザーの名前を返します。 bufptr パラメーターは、WKSTA_USER_INFO_0構造体の配列を指します。 |
|
現在のユーザーの名前と、ワークステーションによってアクセスされるドメインを返します。 bufptr パラメーターは、WKSTA_USER_INFO_1構造体の配列を指します。 |
[out] bufptr
データを受信するバッファーへのポインター。 このデータの形式は 、level パラメーターの値によって異なります。 このバッファーはシステムによって割り当てられ、 NetApiBufferFree 関数を使用して解放する必要があります。 関数がERROR_MORE_DATAで失敗した場合でも、バッファーを解放する必要があることに注意してください。
[in] prefmaxlen
返されるデータの推奨される最大長をバイト単位で指定します。 MAX_PREFERRED_LENGTHを指定すると、データに必要なメモリ量が関数によって割り当てられます。 このパラメーターに別の値を指定すると、関数から返されるバイト数を制限できます。 バッファー サイズが不十分で、すべてのエントリを保持するには、関数は ERROR_MORE_DATAを返します。 詳細については、「 ネットワーク管理機能バッファー 」および「 ネットワーク管理機能バッファーの長さ」を参照してください。
[out] entriesread
実際に列挙された要素の数を受け取る値へのポインター。
[out] totalentries
現在の再開位置から列挙された可能性があるエントリの合計数を受け取る値へのポインター。 アプリケーションでは、この値をヒントとしてのみ考慮する必要があることに注意してください。
[in, out] resumehandle
既存の検索を続行するために使用される再開ハンドルを含む値へのポインター。 最初の呼び出しではハンドルを 0 にし、後続の呼び出しでは変更しない必要があります。 このパラメーターが NULL の場合、再開ハンドルは格納されません。
戻り値
関数が成功した場合、戻り値はNERR_Success。
関数が失敗した場合、戻り値は次のいずれかのエラー コードになります。
リターン コード | 説明 |
---|---|
|
ユーザーには、要求された情報へのアクセス権がありません。 |
|
その他のエントリを使用できます。 すべてのエントリを受信するのに十分な大きさのバッファーを指定します。 |
|
level パラメーターが無効です。 |
注釈
NetWkstaUserEnum 関数には、サービス ログオンとバッチ ログオンのエントリと対話型ログオンのエントリが一覧表示されるため、この関数はワークステーションからログオフしたユーザーのエントリを返すことができます。 これは、たとえば、ユーザーがユーザーを偽装するサービスを呼び出す場合に発生する可能性があります。 このインスタンスでは、サービスがユーザーの偽装を停止するまで、 NetWkstaUserEnum はユーザーのエントリを返します。
Windows Server 2003 および Windows XP: Active Directory を実行しているドメイン コントローラーでこの関数を呼び出すと、セキュリティ保護可能なオブジェクトの ACL に基づいてアクセスが許可または拒否されます。 匿名アクセスを有効にするには、ユーザー Anonymous が "Pre-Windows 2000 互換アクセス" グループのメンバーである必要があります。 これは、匿名トークンに既定で Everyone グループ SID が含まれていないためです。 メンバー サーバーまたはワークステーションでこの関数を呼び出すと、すべての認証済みユーザーが情報を表示できます。 RestrictAnonymous ポリシー設定で匿名アクセスが許可されている場合は、匿名アクセスも許可されます。 RestrictAnonymous ポリシー設定で匿名アクセスが許可されていない場合、管理者のみが関数を正常に実行できます。 管理者、およびサーバー、システム、および印刷オペレーターのローカル グループのメンバーは、情報を表示することもできます。 匿名アクセスの制限の詳細については、「 ネットワーク管理機能のセキュリティ要件」を参照してください。 ACL、ACE、およびアクセス トークンの詳細については、「Access Control モデル」を参照してください。
Windows 2000: Active Directory を実行しているドメイン コントローラーでこの関数を呼び出すと、セキュリティ保護可能なオブジェクトのアクセス制御リスト (ACL) に基づいてアクセスが許可または拒否されます。 既定の ACL では、" Pre-Windows 2000 互換アクセス" グループのすべての認証済みユーザーとメンバーに情報の表示が許可されます。 既定では、"Windows 2000 より前の互換性のあるアクセス" グループには、メンバーとして Everyone が含まれます。 これにより、システムで匿名アクセスが許可されている場合、情報への匿名アクセスが可能になります。 メンバー サーバーまたはワークステーションでこの関数を呼び出すと、すべての認証済みユーザーが情報を表示できます。 RestrictAnonymous ポリシー設定で匿名アクセスが許可されている場合は、匿名アクセスも許可されます。
この関数を使用するアプリケーションをコンパイルするには、_WIN32_WINNT マクロを 0x0400 以降として定義します。 詳細については、「 Windows ヘッダーの使用」を参照してください。
例
次のコード サンプルは、 NetWkstaUserEnum 関数の呼び出しを使用して、ワークステーションに現在ログオンしているすべてのユーザーに関する情報を一覧表示する方法を示しています。 このサンプルでは、情報レベル 0 ( WKSTA_USER_INFO_0) を指定して NetWkstaUserEnum を呼び出します。 このサンプルでは、エントリをループ処理し、ワークステーションにログオンしたユーザーの名前を出力します。 最後に、コード サンプルでは、情報バッファーに割り当てられたメモリを解放し、列挙されたユーザーの合計数を出力します。
#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[])
{
LPWKSTA_USER_INFO_0 pBuf = NULL;
LPWKSTA_USER_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;
LPWSTR 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 = argv[1];
fwprintf(stderr, L"\nUsers currently logged on %s:\n", pszServerName);
//
// Call the NetWkstaUserEnum function, specifying level 0.
//
do // begin do
{
nStatus = NetWkstaUserEnum( pszServerName,
dwLevel,
(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)
{
//
// Only members of the Administrators local group
// can successfully execute NetWkstaUserEnum
// locally and on a remote server.
//
fprintf(stderr, "An access violation has occurred\n");
break;
}
//
// Print the user logged on to the workstation.
//
wprintf(L"\t-- %s\n", pTmpBuf->wkui0_username);
pTmpBuf++;
dwTotalCount++;
}
}
}
//
// Otherwise, indicate a system error.
//
else
fprintf(stderr, "A system error has occurred: %d\n", nStatus);
//
// Free the allocated memory.
//
if (pBuf != NULL)
{
NetApiBufferFree(pBuf);
pBuf = NULL;
}
}
//
// Continue to call NetWkstaUserEnum 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 workstation users.
//
fprintf(stderr, "\nTotal of %d entries enumerated\n", dwTotalCount);
return 0;
}
要件
要件 | 値 |
---|---|
サポートされている最小のクライアント | Windows 2000 Professional [デスクトップ アプリのみ] |
サポートされている最小のサーバー | Windows 2000 Server [デスクトップ アプリのみ] |
対象プラットフォーム | Windows |
ヘッダー | lmwksta.h (Lm.h を含む) |
Library | Netapi32.lib |
[DLL] | Netapi32.dll |