Все, что мне нужно было сделать, это перезапустить Visual Studio, открыть NuGet Package Manager Console
, а затем использовать диалог Manage NuGet Packages
.
В 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);
Я нашел другой способ получить SID:
System.Security.Principal.WindowsIdentity id = System.Security.Principal.WindowsIdentity.GetCurrent();
string sid = id.User.AccountDomainSid.ToString();
ATL::CAccessToken accessToken;
ATL::CSid currentUserSid;
if (accessToken.GetProcessToken(TOKEN_READ | TOKEN_QUERY) &&
accessToken.GetUser(¤tUserSid))
return currentUserSid.Sid();
И в собственном коде:
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);
Это должно дать вам то, что вам нужно:
, используя System.Security.Principal;
...
var sid = WindowsIdentity.GetCurrent () .User;
Свойство User для WindowsIdentity возвращает SID, за Документы MSDN
CodeProject имеет несколько разных методов, которые вы можете попробовать ... Вы не указали, на каких языках вы хотели найти решение.
Если вы хотите получить к нему доступ через командный файл или что-то еще, вы можете посмотреть как PsGetSid Sysinternals . Он переводит SID на имена и наоборот.
Вы не указали, на каком языке вы хотите. Но если вы используете C #, эта статья предлагает как метод WMI, так и более быстрый (хотя и более подробный) метод с использованием API Win32.
http://www.codeproject.com /KB/cs/processownersid.aspx
Я не думаю, что в настоящее время существует другой способ сделать это без использования WMI или API Win32.
Это самый короткий из всех, что я считаю.
UserPrincipal.Current.Sid;
Доступно с .net> = 3.5
В 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;");