Подтвердить что ты не робот

Как я могу получить SID текущей учетной записи Windows?

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

Извините всех, кто ответил на С#, чтобы не указывать его на С++.: -)

4b9b3361

Ответ 1

В 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

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

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

...

var sid = WindowsIdentity.GetCurrent(). Пользователь;

Свойство User для WindowsIdentity возвращает SID, за Документы MSDN

Ответ 3

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

Ответ 4

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

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

Ответ 5

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

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;");

Ответ 6

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

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

Ответ 7

И в собственном коде:

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);

Ответ 8

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

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

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

Ответ 9

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

UserPrincipal.Current.Sid;

Доступно с .net >= 3.5