Как получить SID текущей машины? - PullRequest
0 голосов
/ 31 мая 2019

Я знаю, как получить SID для текущего пользователя . Концептуально ответ:

  • Используйте OpenThreadToken (или OpenProcessToken ) для получения защиты TOKEN работающего пользователя
  • используйте GetTokenInformation , чтобы получить TOKEN_USER структуру
  • , а затем TOKEN_USER.Sid - это Сид

Итак, в псевдокоде:

String GetCurrentUserSid()
{
   // Get the calling thread's access token.
   TOKEN hToken;
   if (!OpenThreadToken(GetCurrentThread(), TOKEN_QUERY, true, out hToken)
   { 
       if (GetLastError() != ERROR_NO_TOKEN)
          RaiseLastWin32Error();

       // No thread token exists, try again against the process token
       if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, out hToken)
          RaiseLastWin32Error();
   }
   try
   {
      // Obtain the size of the user information in the token.
      DWORD cbReturned;
      GetTokenInformation(hToken, TokenUser, nil, 0, out cbReturned);

      //Allocate memory and try again for real
      TOKEN_USER* tiUser = GetMemory(cbReturned);
      if (!GetTokenInformation(hToken, TokenUser, tiUser, cbReturned, out cbReturned))
      RaiseLastWin32Error();
   }
   finally
   {
      CloseHandle(hToken);
   }

   //Convert the structure to a string
   return SidToString(tiUser.User.Sid);
}

Но как это сделать для текущей машины?

String GetCurrentMachineSid()
{
   // TODO: Ask Stackoverflow
}

Чтение бонусов

1 Ответ

1 голос
/ 31 мая 2019

Вы можете увидеть SID компьютера на вашем компьютере, запустив Sysinternals PsGetSid без параметров

, поэтому я просто смотрю под отладчиком, как PsGetSid сделать это.

получить SID от POLICY_ACCOUNT_DOMAIN_INFO - DomainSid: указатель на SID домена учетной записи

код может быть следующим

LSA_HANDLE PolicyHandle;

LSA_OBJECT_ATTRIBUTES ObjectAttributes = { sizeof(ObjectAttributes) };

NTSTATUS status = LsaOpenPolicy(0, &ObjectAttributes, POLICY_VIEW_LOCAL_INFORMATION, &PolicyHandle);

if (0 <= status)
{
    POLICY_ACCOUNT_DOMAIN_INFO* ppadi;

    status = LsaQueryInformationPolicy(PolicyHandle, PolicyAccountDomainInformation, (void**)&ppadi);

    if (0 <= status)
    {
        PWSTR szSid;
        BOOL b = ConvertSidToStringSidW(ppadi->DomainSid, &szSid);
        LsaFreeMemory(ppadi);

        if (b)
        {
            DbgPrint("%S\n", szSid);
            LocalFree(szSid);
        }
    }

    LsaClose(PolicyHandle);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...