gpt4 book ai didi

c++ - 如何枚举已分配指定用户权限的所有 SID? C++

转载 作者:行者123 更新时间:2023-11-27 23:39:03 25 4
gpt4 key购买 nike

我在 Windows 和 C++ 上我想恢复给定权限的所有 SID。为了恢复 SID,我使用了以下方法:LsaOpenPolicy、LsaEnumerateAccountsWithUserRight 和 ConvertSidToStringSidA。问题来自返回错误的 ConvertSidToStringSidA 方法:无效的 SID。这是我使用的代码:

    LSA_HANDLE lsaPolicyHandle;
LSA_OBJECT_ATTRIBUTES lsaObjectAttributes;
ZeroMemory(&lsaObjectAttributes, sizeof (lsaObjectAttributes));
NTSTATUS ntStatus;

ntStatus=LsaOpenPolicy(nullptr,&lsaObjectAttributes, POLICY_ALL_ACCESS, &lsaPolicyHandle);

//Here ntstatus == ERROR_SUCCESS
if(ntStatus != ERROR_SUCCESS)
{
qDebug()<<"error";
}
LSA_UNICODE_STRING lsaUSerRight;
DWORD64 dwLen=0;
LPCWSTR pcwStr = L"SeServiceLogonRight";
dwLen = wcslen(pcwStr);
lsaUSerRight.Buffer = const_cast<wchar_t*>(pcwStr);
lsaUSerRight.Length = static_cast<unsigned short>(dwLen) * sizeof(WCHAR);
lsaUSerRight.MaximumLength= static_cast<unsigned short>(dwLen+1) *sizeof(WCHAR);

LSA_ENUMERATION_INFORMATION pEnumInfo;
ULONG ulCount;
ntStatus=LsaEnumerateAccountsWithUserRight(lsaPolicyHandle,
&lsaUSerRight,
reinterpret_cast<PVOID*>(&pEnumInfo),
&ulCount);
//Here ntstatus == ERROR_SUCCESS
if(ntStatus != ERROR_SUCCESS)
{
qDebug()<<"error";
}
//here pEnumInfo has an adress 0x45FF34c et ulCount = 2
LPSTR lpStringSid;
PSID pSid=pEnumInfo.Sid;

//Here invalid SID
BOOL bResultConvert=ConvertSidToStringSidA(pSid, &lpStringSid);

if(bResultConvert==0)
{
qDebug()<<"error";
}

最佳答案

LsaEnumerateAccountsWithUserRight 填充了一个指向 LSA_ENUMERATION_INFORMATION指针,因此您需要更改它:

LSA_ENUMERATION_INFORMATION pEnumInfo;

为此:

LSA_ENUMERATION_INFORMATION *pEnumInfo;

要访问返回的第一个 SID,请更改:

PSID pSid=pEnumInfo.Sid;

为此:

PSID pSid=pEnumInfo->Sid;

然后就可以了。

不要忘记释放使用 LsaFreeMemory 返回的结构,并使用 LsaClose 进行清理。

关于c++ - 如何枚举已分配指定用户权限的所有 SID? C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56974816/

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