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