我在Windows和C ++上
我想恢复给定特权的所有SID。
为了恢复SID,我使用了以下方法:
LsaOpenPolicy,LsaEnumerateAccountsWithUserRight和ConvertSidToStringSidA。
问题来自于返回错误的InvertSidToStringSidA方法:无效的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
进行清理。