【发布时间】:2018-01-03 20:56:27
【问题描述】:
用NetUserAdd创建用户帐户后,发现需要使用NetLocalGroupAddMembers将用户添加到Users组,所以我调用CreateWellKnownSid获取Users的SID,LookupAccountSid获取来自该 SID 的字符串名称并将其传递给 NetLocalGroupAddMembers.
我还需要指定用户名,但该功能需要domain\name格式为level 3(LOCALGROUP_MEMBERS_INFO_3),但我没有。我决定调用LookupAccountName 来获取用户名SID 并将其传递给level 0 (LOCALGROUP_MEMBERS_INFO_0)。
我就是这样做的:
//LocalAlloc
UINT memAttributes = LMEM_FIXED;
SIZE_T sidSize = SECURITY_MAX_SID_SIZE;
//LookupAccountName
PSID accountSID;
SID_NAME_USE typeOfAccount;
//NetLocalGroupAddMembers
NET_API_STATUS localGroupAdd;
DWORD levelOfData = 0; //LOCALGROUP_MEMBERS_INFO_0
LOCALGROUP_MEMBERS_INFO_0 localMembers;
DWORD totalEntries = 0;
//Allocate memory for LookupAccountName
if (!(accountSID = LocalAlloc(memAttributes, sidSize)))
{
wprintf(L"\nMemory allocation for account SID failed: \n");
ShowError(GetLastError());
exit(1);
}
if (!LookupAccountNameW(NULL, argv[1], accountSID,
(LPDWORD)&sidSize, NULL, 0, &typeOfAccount))
{
fwprintf(stderr, L"Error getting SID from name: \n");
ShowError(GetLastError());
return 1;
}
//Here I should be able to use NetLocalGroupAddMembers
//to add the user passed as argument to the Users group.
localMembers.lgrmi0_sid = accountSID;
localGroupAdd = NetLocalGroupAddMembers(NULL, name, levelOfData, (LPBYTE)&localMembers, totalEntries);
if (localGroupAdd != NERR_Success)
{
fwprintf(stderr, L"Error adding member to the local group: \n");
ShowError(GetLastError());
return 1;
}
else
{
wprintf(L"\nUser %s has been successfully added.\n", argv[1]);
}
这是我得到的错误:
在 UserCreator.exe 中的 0x743F059A (sechost.dll) 处引发异常: 0xC0000005:访问冲突写入位置0x00000000。
有什么线索吗?
【问题讨论】:
-
总是尝试删除像 (LPDWORD) 这样的强制转换,因为它们往往会隐藏错误。在这种情况下这不是问题,但在 64 位程序的其他情况下可能是问题。
-
特别是
sidSize的类型应该是DWORD,而不是SIZE_T(至少,如果你想将它也用于LookupAccountNameW)。