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
데이터를 수신하는 버퍼에 대한 포인터입니다. 이 데이터의 형식은 수준 매개 변수의 값에 따라 달라집니다. 이 버퍼는 시스템에서 할당되며 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 함수는 서비스 및 일괄 로그온 및 대화형 로그온에 대한 항목을 나열하므로 함수는 워크스테이션을 로그오프한 사용자의 항목을 반환할 수 있습니다. 예를 들어 사용자가 사용자를 가장하는 서비스를 호출할 때 이 문제가 발생할 수 있습니다. 이 instance NetWkstaUserEnum은 서비스가 사용자 가장을 중지할 때까지 사용자의 항목을 반환합니다.
Windows Server 2003 및 Windows XP: Active Directory를 실행하는 도메인 컨트롤러에서 이 함수를 호출하는 경우 보안 개체에 대한 ACL에 따라 액세스가 허용되거나 거부됩니다. 익명 액세스를 사용하도록 설정하려면 익명 사용자가 "사전 Windows 2000 호환 액세스" 그룹의 구성원이어야 합니다. 익명 토큰에는 기본적으로 Everyone 그룹 SID가 포함되지 않기 때문입니다. 멤버 서버 또는 워크스테이션에서 이 함수를 호출하는 경우 인증된 모든 사용자가 정보를 볼 수 있습니다. RestrictAnonymous 정책 설정에서 익명 액세스를 허용하는 경우에도 익명 액세스가 허용됩니다. RestrictAnonymous 정책 설정에서 익명 액세스를 허용하지 않는 경우 관리자만 함수를 성공적으로 실행할 수 있습니다. 관리자의 구성원과 서버, 시스템 및 인쇄 연산자 로컬 그룹도 정보를 볼 수 있습니다. 익명 액세스를 제한하는 방법에 대한 자세한 내용은 네트워크 관리 함수에 대한 보안 요구 사항을 참조하세요. ACL, ACL 및 액세스 토큰에 대한 자세한 내용은 Access Control 모델을 참조하세요.
Windows 2000: Active Directory를 실행하는 도메인 컨트롤러에서 이 함수를 호출하는 경우 보안 개체에 대한 ACL(액세스 제어 목록)에 따라 액세스가 허용되거나 거부됩니다. 기본 ACL은 " Windows 2000 이전 호환 액세스" 그룹의 모든 인증된 사용자와 구성원이 정보를 볼 수 있도록 허용합니다. 기본적으로 "사전 Windows 2000 호환 액세스" 그룹에는 모든 사용자가 구성원으로 포함됩니다. 이렇게 하면 시스템에서 익명 액세스를 허용하는 경우 정보에 익명으로 액세스할 수 있습니다. 멤버 서버 또는 워크스테이션에서 이 함수를 호출하는 경우 인증된 모든 사용자가 정보를 볼 수 있습니다. RestrictAnonymous 정책 설정에서 익명 액세스를 허용하는 경우에도 익명 액세스가 허용됩니다.
이 함수를 사용하는 애플리케이션을 컴파일하려면 _WIN32_WINNT 매크로를 0x0400 이상으로 정의합니다. 자세한 내용은 Windows 헤더 사용을 참조하세요.
예제
다음 코드 샘플에서는 NetWkstaUserEnum 함수에 대한 호출을 사용하여 현재 워크스테이션에 로그온한 모든 사용자에 대한 정보를 나열하는 방법을 보여 줍니다. 샘플은 NetWkstaUserEnum을 호출하여 정보 수준 0( WKSTA_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[])
{
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 포함) |
라이브러리 | Netapi32.lib |
DLL | Netapi32.dll |