本节演示如何在Windows NT中创建新的计算机帐户。
以下是管理计算机帐户的注意事项:
*与Windows NT帐户管理实用程序一致,计算机帐户名称应全部为大写。
*计算机帐号名称始终包含美元符号($)。用于管理计算机帐户的任何功能都必须构建计算机名称,以使计算机帐户名称的最后一个字符为美元符号($)。对于域间信任,帐户名称为TrustingDomainName $。
*最大计算机名称长度为MAX_COMPUTERNAME_LENGTH(15)。此长度不包括尾随的美元符号($)。
*新计算机帐户的密码应为计算机帐户名称的小写表示,而不含美元符号($)。对于域间信任,密码可以是与关系的信任方指定的值相匹配的任意值。
*最大密码长度为LM20_PWLEN(14)。如果计算机帐户名称超过此长度,密码将被截短为此长度。
*在计算机帐户创建时提供的密码只有在计算机帐户在域上激活后才有效。在信任关系激活期间建立了一个新的信息。
#include < windows.h >
的#include < lm.h >
BOOL AddMachineAccount(
LPCWSTR wTargetComputer,
LPWSTR MachineAccount,
DWORD AccountType
)
{
LPWSTR wAccount;
LPWSTR wPassword;
USER_INFO_1 ui;
DWORD cbAccount;
DWORD cbLength;
DWORD dwError;
//
//确保传递了有效的计算机帐户类型。
//
if (AccountType != UF_WORKSTATION_TRUST_ACCOUNT &&
AccountType != UF_SERVER_TRUST_ACCOUNT &&
AccountType != UF_INTERDOMAIN_TRUST_ACCOUNT
)
{
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
}
//
//获取计算机帐户名中的字符数。
//
cbLength = cbAccount = lstrlenW(MachineAccount);
//
//确保计算机名称不超过最大长度。
//
if(cbLength > MAX_COMPUTERNAME_LENGTH){
SetLastError(ERROR_INVALID_ACCOUNT_NAME);
return FALSE;
}
//
//分配存储以包含Unicode表示形式
//计算机帐户名+尾随$ + NULL。
//
wAccount=(LPWSTR)HeapAlloc(GetProcessHeap(), 0,
(cbAccount + 1 + 1) * sizeof(WCHAR) // Account +'$'+ NULL
);
if(wAccount == NULL) return FALSE;
//
//密码是将计算机帐户名转换为小写
//您将转换已通过的MachineAccount到位。
//
wPassword = MachineAccount;
//
//将MachineAccount复制到分配的wAccount缓冲区
//将计算机帐户名转换为大写字母。
//将密码(inplace)转换为小写。
//
while(cbAccount--){
wAccount[cbAccount] = towupper( MachineAccount[cbAccount] );
wPassword[cbAccount] = towlower( wPassword[cbAccount] );
}
//
//计算机帐户名称具有尾随的Unicode'$'。
//
wAccount[cbLength] = L'$';
wAccount[cbLength + 1] = L'\0'; //终止字符串
//
//如果密码大于允许的最大值,则截断。
//
if(cbLength > LM20_PWLEN) wPassword[LM20_PWLEN] = L'\0';
//
//初始化USER_INFO_x结构。
//
ZeroMemory(&ui, sizeof(ui));
ui.usri1_name = wAccount;
ui.usri1_password = wPassword;
ui.usri1_flags = AccountType | UF_SCRIPT;
ui.usri1_priv = USER_PRIV_USER;
dwError=NetUserAdd(
wTargetComputer, //目标计算机名称
1, // info level
(LPBYTE) &ui, // 缓冲
NULL
);
//
//自由分配内存
//
if(wAccount) HeapFree(GetProcessHeap(), 0, wAccount);
//
//指示功能是否成功。
//
if(dwError == NO_ERROR)
return TRUE;
else {
SetLastError(dwError);
return FALSE;
}
}
调用帐户管理功能的用户必须在目标计算机上具有管理员权限。在现有计算机帐户的情况下,帐户的创建者可以管理该帐户,而不管管理员是谁。
可以在目标计算机上授予SeMachineAccountPrivilege以给予指定用户创建计算机帐户的能力。这使得非管理员能够创建计算机帐户。呼叫者需要在添加计算机帐户之前启用此权限。