我在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";
}
答案 0 :(得分:3)
LsaEnumerateAccountsWithUserRight
将指针填充到LSA_ENUMERATION_INFORMATION
中,因此您需要进行以下更改:
LSA_ENUMERATION_INFORMATION pEnumInfo;
对此:
LSA_ENUMERATION_INFORMATION *pEnumInfo;
并访问返回的第一个SID,请更改以下内容:
PSID pSid=pEnumInfo.Sid;
对此:
PSID pSid=pEnumInfo->Sid;
然后它起作用。
完成操作后,别忘了释放用LsaFreeMemory
返回的结构并用LsaClose
进行清理。