Извлечь SID текущего пользователя [дубликат]

Все, что мне нужно было сделать, это перезапустить Visual Studio, открыть NuGet Package Manager Console, а затем использовать диалог Manage NuGet Packages.

27
задан Franci Penov 30 October 2008 в 20:10
поделиться

9 ответов

В 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);
46
ответ дан Roger Lipscombe 20 August 2018 в 09:54
поделиться

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

System.Security.Principal.WindowsIdentity id = System.Security.Principal.WindowsIdentity.GetCurrent();
string sid = id.User.AccountDomainSid.ToString();
1
ответ дан cigar huang 20 August 2018 в 09:54
поделиться
ATL::CAccessToken accessToken;
ATL::CSid currentUserSid;
if (accessToken.GetProcessToken(TOKEN_READ | TOKEN_QUERY) &&
    accessToken.GetUser(&currentUserSid))
    return currentUserSid.Sid();
6
ответ дан dex black 20 August 2018 в 09:54
поделиться

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

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);
1
ответ дан Ian Boyd 20 August 2018 в 09:54
поделиться

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

, используя System.Security.Principal;

...

var sid = WindowsIdentity.GetCurrent () .User;

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

7
ответ дан Jeffrey Meyer 20 August 2018 в 09:54
поделиться

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

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

2
ответ дан Kevin Fairchild 20 August 2018 в 09:54
поделиться

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

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

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

0
ответ дан Mel Green 20 August 2018 в 09:54
поделиться

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

UserPrincipal.Current.Sid;

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

0
ответ дан nullpotent 20 August 2018 в 09:54
поделиться

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

2
ответ дан silverbugg 20 August 2018 в 09:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: