gpt4 book ai didi

c - 使用 LookupAccountName 时访问冲突写入位置 0x00000000

转载 作者:太空宇宙 更新时间:2023-11-04 04:19:34 25 4
gpt4 key购买 nike

在使用 NetUserAdd 创建用户帐户后,我发现我需要使用 NetLocalGroupAddMembers 将用户添加到用户组,所以我调用了 CreateWellKnownSid 获取用户的 SID,LookupAccountSid 从该 SID 获取字符串名称并将其传递给 NetLocalGroupAddMembers。

我还需要指定用户名,但函数需要域\名称格式为级别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]);

}

这是我遇到的错误:

Exception thrown at 0x743F059A (sechost.dll) in UserCreator.exe:0xC0000005: Access violation writing location 0x00000000.

有什么线索吗?

最佳答案

ReferencedDomainName 参数实际上不是可选的。

LPCTSTR machine = NULL, username = /*TEXT("Anders")*/ argv[1];
TCHAR domain[MAX_PATH];
BYTE accountSIDbuf[SECURITY_MAX_SID_SIZE];
PSID accountSID = (PSID) accountSIDbuf;
DWORD cbSid = SECURITY_MAX_SID_SIZE, cchRD = MAX_PATH;
SID_NAME_USE snu;

if (!LookupAccountName(machine, username, accountSID, &cbSid, domain, &cchRD, &snu))
{
printf("Error %u\n", GetLastError());
return ;
}

LPTSTR sidstr;
if (!ConvertSidToStringSid(accountSID, &sidstr)) { return ; }
_tprintf(_T("SID of %s\\%s is %s\n"), domain, username, sidstr);
LocalFree(sidstr);

您的代码的另一个问题是 ShowError(GetLastError()); 您不能在调用其他函数后使用 GetLastError()。重写为

DWORD error = GetLastError();
fwprintf(stderr, L"Error getting SID from name: \n");
ShowError(error);

但在这种情况下,即使这样也是错误的,因为 NetLocalGroupAddMembers 没有调用 SetLastError,它只是直接返回错误代码。

编辑:

只是为了阐明参数的用法;如果你想查询所需的域缓冲区大小,你可以这样做:

DWORD cchRD = 0;
LookupAccountName(..., NULL, &cchRD, &snu); // The function is still going to report failure
LPTSTR domain = malloc(cchRD * sizeof(*domain));
LookupAccountName(..., domain, &cchRD, &snu);

在我的示例中,我通过传递一个“足够大”的缓冲区来避免这种情况。

关于c - 使用 LookupAccountName 时访问冲突写入位置 0x00000000,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48085009/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com