NetUserGetInfo 函式 (lmaccess.h)
NetUserGetInfo 函式會擷取伺服器上特定用戶帳戶的相關信息。
語法
NET_API_STATUS NET_API_FUNCTION NetUserGetInfo(
[in] LPCWSTR servername,
[in] LPCWSTR username,
[in] DWORD level,
[out] LPBYTE *bufptr
);
參數
[in] servername
常數位符串的指標,指定要在其中執行函式之遠端伺服器的 DNS 或 NetBIOS 名稱。 如果此參數為 NULL,則會使用本機電腦。
[in] username
常數位符串的指標,指定要傳回資訊的用戶帳戶名稱。 如需詳細資訊,請參閱接下來的<備註>一節。
[in] level
數據的資訊層級。 此參數可以是下列其中一個值。
值 | 意義 |
---|---|
|
傳回用戶帳戶名稱。 bufptr 參數會指向USER_INFO_0結構。 |
|
傳回用戶帳戶的詳細資訊。 bufptr 參數指向USER_INFO_1結構。 |
|
傳回用戶帳戶的詳細資訊和其他屬性。 bufptr 參數會指向USER_INFO_2結構。 |
|
傳回用戶帳戶的詳細資訊和其他屬性。 此層級只在伺服器上有效。 bufptr 參數指向USER_INFO_3結構。 請注意,建議您改用 USER_INFO_4 。 |
|
傳回用戶帳戶的詳細資訊和其他屬性。 此層級只在伺服器上有效。 bufptr 參數指向USER_INFO_4結構。
注意 Windows XP 和更新版本支援此層級。
|
|
傳回用戶和帳戶名稱和批注。 bufptr 參數會指向USER_INFO_10結構。 |
|
傳回用戶帳戶的詳細資訊。 bufptr 參數指向USER_INFO_11結構。 |
|
傳回使用者的名稱和標識碼和各種帳戶屬性。 bufptr 參數指向USER_INFO_20結構。 請注意,在 Windows XP 和更新版本上,建議您改用 USER_INFO_23 。 |
|
傳回使用者的名稱和標識碼和各種帳戶屬性。 bufptr 參數指向USER_INFO_23結構。
注意 Windows XP 和更新版本支援此層級。
|
|
傳回連線到因特網身分識別之帳戶的用戶帳戶資訊。 bufptr 參數會指向USER_INFO_24結構。
注意Windows 8 和 Windows Server 2012 支援層級。
|
[out] bufptr
接收數據的緩衝區指標。 此數據的格式取決於 level 參數的值。 此緩衝區是由系統所配置,必須使用 NetApiBufferFree 函式釋放。 如需詳細資訊,請參閱 網路管理功能緩衝區 和 網路管理函式緩衝區長度。
傳回值
如果函式成功,傳回值會NERR_Success。
如果函式失敗,傳回值可以是下列其中一個錯誤碼。
傳回碼 | Description |
---|---|
|
用戶無法存取要求的資訊。 |
|
找不到 servername 參數中指定的網路路徑。 |
|
為 level 參數指定的值無效。 |
|
電腦名稱無效。 |
|
找不到用戶名稱。 |
備註
如果您是針對 Active Directory 進行程式設計,您可以呼叫特定 Active Directory 服務介面 (ADSI) 方法來達到相同的功能,方法是呼叫網路管理使用者函式。 如需詳細資訊,請參閱 IADsUser 和 IADsComputer。
如果您在執行 Active Directory 的域控制器上呼叫此函式,則會根據 安全性實體對象的訪問控制清單 (ACL) ,允許或拒絕存取。 默認 ACL 允許「Windows 2000 前相容存取」群組的所有已驗證使用者和成員檢視資訊。 如果您在成員伺服器或工作站上呼叫此函式,所有已驗證的使用者都可以檢視資訊。 如需匿名存取和限制這些平臺上匿名存取的資訊,請參閱 網路管理功能的安全性需求。 如需 ACL、ACE 和存取令牌的詳細資訊,請參閱 存取控制 模型。
User 對象的安全性描述項是用來執行此函式的存取檢查。
用戶帳戶名稱限製為 20 個字元,且組名限製為 256 個字元。 此外,帳戶名稱不能以句號終止,而且不能包含逗號或任何下列可列印字元:“、/、、[、]、:、|、<>+、=、;、?、*。 名稱也無法在範圍 1-31 中包含不可列印的字元。
如果 level 參數中指定的資訊層級設定為 24,則指定的 servername 參數必須解析為本機電腦。 如果 servername 解析為遠端電腦或域控制器, NetUserGetInfo 函式將會失敗。
範例
下列程式代碼範例示範如何使用 對 NetUserGetInfo 函式的呼叫來擷取特定使用者帳戶的相關信息。 這個範例會呼叫 NetUserGetInfo,並指定各種資訊層級 。 如果呼叫成功,程式代碼會列印用戶帳戶的相關信息。 最後,此範例會釋放配置給資訊緩衝區的記憶體。
#ifndef UNICODE
#define UNICODE
#endif
#pragma comment(lib, "advapi32.lib")
#pragma comment(lib, "netapi32.lib")
#include <windows.h>
#include <stdio.h>
#include <assert.h>
#include <lm.h>
#include <sddl.h> /* for ConvertSidToStringSid function */
int wmain(int argc, wchar_t * argv[])
{
DWORD dwLevel = 0;
LPUSER_INFO_0 pBuf = NULL;
LPUSER_INFO_1 pBuf1 = NULL;
LPUSER_INFO_2 pBuf2 = NULL;
LPUSER_INFO_3 pBuf3 = NULL;
LPUSER_INFO_4 pBuf4 = NULL;
LPUSER_INFO_10 pBuf10 = NULL;
LPUSER_INFO_11 pBuf11 = NULL;
LPUSER_INFO_20 pBuf20 = NULL;
LPUSER_INFO_23 pBuf23 = NULL;
NET_API_STATUS nStatus;
LPTSTR sStringSid = NULL;
int i = 0;
int j = 0;
if (argc != 3)
{
fwprintf(stderr, L"Usage: %s \\\\ServerName UserName\n", argv[0]);
exit(1);
}
while (i < 24)
{
//
// Call the NetUserGetInfo function.
//
dwLevel = i;
wprintf
(L"\nCalling NetUserGetinfo with Servername=%s Username=%s Level=%d\n",
argv[1], argv[2], dwLevel);
nStatus = NetUserGetInfo(argv[1], argv[2], dwLevel, (LPBYTE *) & pBuf);
//
// If the call succeeds, print the user information.
//
if (nStatus == NERR_Success)
{
if (pBuf != NULL)
{
switch (i)
{
case 0:
wprintf(L"\tUser account name: %s\n", pBuf->usri0_name);
break;
case 1:
pBuf1 = (LPUSER_INFO_1) pBuf;
wprintf(L"\tUser account name: %s\n", pBuf1->usri1_name);
wprintf(L"\tPassword: %s\n", pBuf1->usri1_password);
wprintf(L"\tPassword age (seconds): %d\n",
pBuf1->usri1_password_age);
wprintf(L"\tPrivilege level: %d\n", pBuf1->usri1_priv);
wprintf(L"\tHome directory: %s\n", pBuf1->usri1_home_dir);
wprintf(L"\tUser comment: %s\n", pBuf1->usri1_comment);
wprintf(L"\tFlags (in hex): %x\n", pBuf1->usri1_flags);
wprintf(L"\tScript path: %s\n", pBuf1->usri1_script_path);
break;
case 2:
pBuf2 = (LPUSER_INFO_2) pBuf;
wprintf(L"\tUser account name: %s\n", pBuf2->usri2_name);
wprintf(L"\tPassword: %s\n", pBuf2->usri2_password);
wprintf(L"\tPassword age (seconds): %d\n",
pBuf2->usri2_password_age);
wprintf(L"\tPrivilege level: %d\n", pBuf2->usri2_priv);
wprintf(L"\tHome directory: %s\n", pBuf2->usri2_home_dir);
wprintf(L"\tComment: %s\n", pBuf2->usri2_comment);
wprintf(L"\tFlags (in hex): %x\n", pBuf2->usri2_flags);
wprintf(L"\tScript path: %s\n", pBuf2->usri2_script_path);
wprintf(L"\tAuth flags (in hex): %x\n",
pBuf2->usri2_auth_flags);
wprintf(L"\tFull name: %s\n", pBuf2->usri2_full_name);
wprintf(L"\tUser comment: %s\n", pBuf2->usri2_usr_comment);
wprintf(L"\tParameters: %s\n", pBuf2->usri2_parms);
wprintf(L"\tWorkstations: %s\n", pBuf2->usri2_workstations);
wprintf
(L"\tLast logon (seconds since January 1, 1970 GMT): %d\n",
pBuf2->usri2_last_logon);
wprintf
(L"\tLast logoff (seconds since January 1, 1970 GMT): %d\n",
pBuf2->usri2_last_logoff);
wprintf
(L"\tAccount expires (seconds since January 1, 1970 GMT): %d\n",
pBuf2->usri2_acct_expires);
wprintf(L"\tMax storage: %d\n", pBuf2->usri2_max_storage);
wprintf(L"\tUnits per week: %d\n",
pBuf2->usri2_units_per_week);
wprintf(L"\tLogon hours:");
for (j = 0; j < 21; j++)
{
printf(" %x", (BYTE) pBuf2->usri2_logon_hours[j]);
}
wprintf(L"\n");
wprintf(L"\tBad password count: %d\n",
pBuf2->usri2_bad_pw_count);
wprintf(L"\tNumber of logons: %d\n",
pBuf2->usri2_num_logons);
wprintf(L"\tLogon server: %s\n", pBuf2->usri2_logon_server);
wprintf(L"\tCountry code: %d\n", pBuf2->usri2_country_code);
wprintf(L"\tCode page: %d\n", pBuf2->usri2_code_page);
break;
case 4:
pBuf4 = (LPUSER_INFO_4) pBuf;
wprintf(L"\tUser account name: %s\n", pBuf4->usri4_name);
wprintf(L"\tPassword: %s\n", pBuf4->usri4_password);
wprintf(L"\tPassword age (seconds): %d\n",
pBuf4->usri4_password_age);
wprintf(L"\tPrivilege level: %d\n", pBuf4->usri4_priv);
wprintf(L"\tHome directory: %s\n", pBuf4->usri4_home_dir);
wprintf(L"\tComment: %s\n", pBuf4->usri4_comment);
wprintf(L"\tFlags (in hex): %x\n", pBuf4->usri4_flags);
wprintf(L"\tScript path: %s\n", pBuf4->usri4_script_path);
wprintf(L"\tAuth flags (in hex): %x\n",
pBuf4->usri4_auth_flags);
wprintf(L"\tFull name: %s\n", pBuf4->usri4_full_name);
wprintf(L"\tUser comment: %s\n", pBuf4->usri4_usr_comment);
wprintf(L"\tParameters: %s\n", pBuf4->usri4_parms);
wprintf(L"\tWorkstations: %s\n", pBuf4->usri4_workstations);
wprintf
(L"\tLast logon (seconds since January 1, 1970 GMT): %d\n",
pBuf4->usri4_last_logon);
wprintf
(L"\tLast logoff (seconds since January 1, 1970 GMT): %d\n",
pBuf4->usri4_last_logoff);
wprintf
(L"\tAccount expires (seconds since January 1, 1970 GMT): %d\n",
pBuf4->usri4_acct_expires);
wprintf(L"\tMax storage: %d\n", pBuf4->usri4_max_storage);
wprintf(L"\tUnits per week: %d\n",
pBuf4->usri4_units_per_week);
wprintf(L"\tLogon hours:");
for (j = 0; j < 21; j++)
{
printf(" %x", (BYTE) pBuf4->usri4_logon_hours[j]);
}
wprintf(L"\n");
wprintf(L"\tBad password count: %d\n",
pBuf4->usri4_bad_pw_count);
wprintf(L"\tNumber of logons: %d\n",
pBuf4->usri4_num_logons);
wprintf(L"\tLogon server: %s\n", pBuf4->usri4_logon_server);
wprintf(L"\tCountry code: %d\n", pBuf4->usri4_country_code);
wprintf(L"\tCode page: %d\n", pBuf4->usri4_code_page);
if (ConvertSidToStringSid
(pBuf4->usri4_user_sid, &sStringSid))
{
wprintf(L"\tUser SID: %s\n", sStringSid);
LocalFree(sStringSid);
}
else
wprintf(L"ConvertSidToSTringSid failed with error %d\n",
GetLastError());
wprintf(L"\tPrimary group ID: %d\n",
pBuf4->usri4_primary_group_id);
wprintf(L"\tProfile: %s\n", pBuf4->usri4_profile);
wprintf(L"\tHome directory drive letter: %s\n",
pBuf4->usri4_home_dir_drive);
wprintf(L"\tPassword expired information: %d\n",
pBuf4->usri4_password_expired);
break;
case 10:
pBuf10 = (LPUSER_INFO_10) pBuf;
wprintf(L"\tUser account name: %s\n", pBuf10->usri10_name);
wprintf(L"\tComment: %s\n", pBuf10->usri10_comment);
wprintf(L"\tUser comment: %s\n",
pBuf10->usri10_usr_comment);
wprintf(L"\tFull name: %s\n", pBuf10->usri10_full_name);
break;
case 11:
pBuf11 = (LPUSER_INFO_11) pBuf;
wprintf(L"\tUser account name: %s\n", pBuf11->usri11_name);
wprintf(L"\tComment: %s\n", pBuf11->usri11_comment);
wprintf(L"\tUser comment: %s\n",
pBuf11->usri11_usr_comment);
wprintf(L"\tFull name: %s\n", pBuf11->usri11_full_name);
wprintf(L"\tPrivilege level: %d\n", pBuf11->usri11_priv);
wprintf(L"\tAuth flags (in hex): %x\n",
pBuf11->usri11_auth_flags);
wprintf(L"\tPassword age (seconds): %d\n",
pBuf11->usri11_password_age);
wprintf(L"\tHome directory: %s\n", pBuf11->usri11_home_dir);
wprintf(L"\tParameters: %s\n", pBuf11->usri11_parms);
wprintf
(L"\tLast logon (seconds since January 1, 1970 GMT): %d\n",
pBuf11->usri11_last_logon);
wprintf
(L"\tLast logoff (seconds since January 1, 1970 GMT): %d\n",
pBuf11->usri11_last_logoff);
wprintf(L"\tBad password count: %d\n",
pBuf11->usri11_bad_pw_count);
wprintf(L"\tNumber of logons: %d\n",
pBuf11->usri11_num_logons);
wprintf(L"\tLogon server: %s\n",
pBuf11->usri11_logon_server);
wprintf(L"\tCountry code: %d\n",
pBuf11->usri11_country_code);
wprintf(L"\tWorkstations: %s\n",
pBuf11->usri11_workstations);
wprintf(L"\tMax storage: %d\n", pBuf11->usri11_max_storage);
wprintf(L"\tUnits per week: %d\n",
pBuf11->usri11_units_per_week);
wprintf(L"\tLogon hours:");
for (j = 0; j < 21; j++)
{
printf(" %x", (BYTE) pBuf11->usri11_logon_hours[j]);
}
wprintf(L"\n");
wprintf(L"\tCode page: %d\n", pBuf11->usri11_code_page);
break;
case 20:
pBuf20 = (LPUSER_INFO_20) pBuf;
wprintf(L"\tUser account name: %s\n", pBuf20->usri20_name);
wprintf(L"\tFull name: %s\n", pBuf20->usri20_full_name);
wprintf(L"\tComment: %s\n", pBuf20->usri20_comment);
wprintf(L"\tFlags (in hex): %x\n", pBuf20->usri20_flags);
wprintf(L"\tUser ID: %u\n", pBuf20->usri20_user_id);
break;
case 23:
pBuf23 = (LPUSER_INFO_23) pBuf;
wprintf(L"\tUser account name: %s\n", pBuf23->usri23_name);
wprintf(L"\tFull name: %s\n", pBuf23->usri23_full_name);
wprintf(L"\tComment: %s\n", pBuf23->usri23_comment);
wprintf(L"\tFlags (in hex): %x\n", pBuf23->usri23_flags);
if (ConvertSidToStringSid
(pBuf23->usri23_user_sid, &sStringSid))
{
wprintf(L"\tUser SID: %s\n", sStringSid);
LocalFree(sStringSid);
}
else
wprintf(L"ConvertSidToSTringSid failed with error %d\n",
GetLastError());
break;
default:
break;
}
}
}
// Otherwise, print the system error.
//
else
fprintf(stderr, "NetUserGetinfo failed with error: %d\n", nStatus);
//
// Free the allocated memory.
//
if (pBuf != NULL)
NetApiBufferFree(pBuf);
switch (i)
{
case 0:
case 1:
case 10:
i++;
break;
case 2:
i = 4;
break;
case 4:
i = 10;
break;
case 11:
i = 20;
break;
case 20:
i = 23;
break;
default:
i = 24;
break;
}
}
return 0;
}
規格需求
需求 | 值 |
---|---|
最低支援的用戶端 | Windows XP [僅限傳統型應用程式] |
最低支援的伺服器 | Windows Server 2003 [僅限桌面應用程式] |
目標平台 | Windows |
標頭 | lmaccess.h (包含 Lm.h) |
程式庫 | Netapi32.lib |
Dll | Netapi32.dll |