2008-10-30 5 views
26

Я ищу простой способ получить SID для текущей учетной записи пользователя Windows. Я знаю, что могу сделать это через WMI, но я не хочу идти по этому маршруту.Как я могу получить SID текущей учетной записи Windows?

Извините за всех, кто ответил на C#, не указав, что это C++. :-)

+0

языка программирования/окружающая среда? – 2008-10-30 18:31:57

ответ

43

В Win32, вызовите GetTokenInformation, передавая маркер ручку и постоянную TokenUser. Он заполнит для вас структуру TOKEN_USER. Один из элементов в нем - SID пользователя. Это BLOB (двоичный), но вы можете превратить его в строку, используя ConvertSidToStringSid.

Чтобы получить ручку текущего маркера, используйте OpenThreadToken или OpenProcessToken.

Если вы предпочитаете ATL, у него есть класс CAccessToken, в котором есть всевозможные интересные вещи.

. NET имеет свойство Thread.CurrentPrinciple, которое возвращает ссылку IPrincipal. Вы можете получить SID:

IPrincipal principal = Thread.CurrentPrincipal; 
WindowsIdentity identity = principal.Identity as WindowsIdentity; 
if (identity != null) 
    Console.WriteLine(identity.User); 

Кроме того, в .NET, вы можете использовать WindowsIdentity.GetCurrent(), который возвращает текущий идентификатор пользователя:

WindowsIdentity identity = WindowsIdentity.GetCurrent(); 
if (identity != null) 
    Console.WriteLine(identity.User); 
2

CodeProject имеет несколько различных методов, вы можете попробовать ... Вы не говоря уже о каких языках вы хотели получить решение в.

Если вы хотите получить доступ к нему с помощью пакетного файла или что-то, вам может выглядеть как PsGetSid на Sysinternals. Он переводит SID на имена и наоборот.

0

Вы не указали, какой язык вы хотите. Но если вы используете C#, эта статья предлагает как метод WMI, так и более быстрый (хотя и более подробный) метод с использованием Win32 API.

http://www.codeproject.com/KB/cs/processownersid.aspx

Я не думаю, что в настоящее время еще один способ сделать это без использования WMI или API Win32.

6

Это должно дать вам то, что вам нужно:

использованием System.Security.Principal;

...

вар с.и.д. = WindowsIdentity.GetCurrent() пользователя.

Свойство пользователя из WindowsIdentity возвращает SID, за MSDN Docs

2

В C# вы можете использовать либо

using Microsoft.Win32.Security;

...

string username = Environment.UserName + "@" + Environment.GetEnvironmentVariable("USERDNSDOMAIN");

Sid sidUser = new Sid (username);

Или ...

using System.Security.AccessControl;

using System.Security.Principal;

...

WindowsIdentity m_Self = WindowsIdentity.GetCurrent();

SecurityIdentifier m_SID = m_Self.Owner;");

1

Я нашел другой способ получить SID:

System.Security.Principal.WindowsIdentity id = System.Security.Principal.WindowsIdentity.GetCurrent(); 
string sid = id.User.AccountDomainSid.ToString(); 
0

Это один из самых коротких из всех, что я считаю.

UserPrincipal.Current.Sid; 

Доступно с .net> = 3,5

5
ATL::CAccessToken accessToken; 
ATL::CSid currentUserSid; 
if (accessToken.GetProcessToken(TOKEN_READ | TOKEN_QUERY) && 
    accessToken.GetUser(&currentUserSid)) 
    return currentUserSid.Sid(); 
+0

Это очень красноречиво. – 2016-10-13 19:50:59

0

И в нативном коде:

function GetCurrentUserSid: string; 

    hAccessToken: THandle; 
    userToken: PTokenUser; 
    dwInfoBufferSize: DWORD; 
    dw: DWORD; 

    if not OpenThreadToken(GetCurrentThread, TOKEN_QUERY, True, ref hAccessToken) then 
     dw <- GetLastError; 
     if dw <> ERROR_NO_TOKEN then 
      RaiseLastOSError(dw); 

     if not OpenProcessToken(GetCurrentProcess, TOKEN_QUERY, ref hAccessToken) then 
      RaiseLastOSError; 
    try 
     userToken <- GetMemory(1024); 
     try 
      if not GetTokenInformation(hAccessToken, TokenUser, userToken, 1024, ref dwInfoBufferSize) then 
       RaiseLastOSError; 
      Result <- SidToString(userToken.User.Sid); 
     finally 
      FreeMemory(userToken); 
    finally 
     CloseHandle(hAccessToken); 

 Смежные вопросы

  • Нет связанных вопросов^_^