從包含安全描述符字串格式的字串變數開始,我將此字串轉換為安全描述符(使用ConvertStringSecurityDescriptorToSecurityDescriptorW函式)。
這個函式給了我一個指向安全描述符的“指標”(我把指標放在相對于這篇博文的引號下)。
接下來,我使用GetSecurityDescriptorDacl函式恢復指向所指向的安全描述符的 DACL 的指標。從這個 DACL,我將所有的 ACE 存盤到一個指向ACCESS_ALLOWED_ACE結構的指標向量中。最后,在這些結構中,有我的目標成員 ( SidStart ),我想用它來獲得 SID 的“翻譯”(例如,對于眾所周知的 SID,我想將“S-1-1-0”翻譯成最終用戶可讀的字串,如“Everyone”)。
但是,SidStart 只提供受托人 SID 的第一個 DWORD。SID 的剩余位元組存盤在 SidStart 成員之后的連續記憶體中(如檔案所述)。盡管我在互聯網上進行了研究,但我無法弄清楚如何獲得這些剩余的位元組。
這是 C 控制臺應用程式中的最小可重現示例:
#include <iostream>
#include <Windows.h>
#include <sddl.h>
#include <vector>
using namespace std;
int main()
{
LPCWSTR stringSecurityDescriptor = L"D:AI(D;OICI;DCLCDTSD;;;S-1-1-0)";
PSECURITY_DESCRIPTOR pSD;
ConvertStringSecurityDescriptorToSecurityDescriptorW(stringSecurityDescriptor, SDDL_REVISION_1, &pSD, nullptr);
PACL pDacl;
BOOL bDaclPresent = SE_DACL_PRESENT;
BOOL bDaclDefaulted = SE_DACL_DEFAULTED;
GetSecurityDescriptorDacl(pSD, &bDaclPresent, &pDacl, &bDaclDefaulted);
LPVOID pAce;
ACCESS_ALLOWED_ACE* pAceBuffer;
vector<ACCESS_ALLOWED_ACE*> pDaclAces;
if (bDaclPresent)
{
for (int i = 0; i < pDacl->AceCount; i )
{
GetAce(pDacl, i, &pAce);
pAceBuffer = (ACCESS_ALLOWED_ACE*)pAce;
pDaclAces.push_back(pAceBuffer);
}
}
/* TODO : Get the SID of the ACEs */
}
我在 C 編程(以及一般編程)方面相對較新,尤其是在 winapi 環境中。此外,這是我關于 StackOverflow 的第一個問題。我希望我的問題是清楚的、可以理解的和可以解決的。我對批評者持開放態度。
uj5u.com熱心網友回復:
感謝@RbMm 在我的問題的評論部分:
使用 (PSID)&SidStart
我已將此行添加到我的專案中(通過替換最小可重現示例中的 TODO 部分)以對其進行測驗:
PSID pSid = (PSID)&pDaclAces[0]->SidStart
然后我通過重用和重新調整這個帶有微軟檔案的頁面來將它轉換成一個可讀的字串,所有這些都完美地作業。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/360371.html
上一篇:C遞增指標地址傳遞給函式 運算子
