2009-02-03 4 views
31

Я хотел бы отобразить некоторые дополнительные элементы пользовательского интерфейса, когда процесс запускается в качестве администратора, а не когда он не похож на то, как Visual Studio 2008 отображает «Администратор» в строке заголовка при работе в качестве администратора. Как я могу сказать?Как узнать, работает ли мой процесс как Администратор?

+0

Ответ на это тот же: http://stackoverflow.com/questions/95912/how-can-i-detect-if-my-process-is-running-uac-elevated-or- не – DSO

+0

Также смотрите здесь http://www.blackwasp.co.uk/CheckAdmin.aspx –

ответ

33

Технически, если вы хотите, чтобы увидеть, если член является локальным администратором счет, то вы можете получить security identifier (SID) текущего пользователя через User property на WindowsIdentity class, как и (статический GetCurrent method получает текущего пользователя Windows,):

WindowsIdentity windowsIdentity = WindowsIdentity.GetCurrent(); 

string sid = windowsIdentity.User.ToString(); 

свойство User возвращает SID пользователя, который has a number of predefined values for various groups and users.

Тогда вы бы проверить, если the SID has the following pattern, indicating it is the local administrator account (which is a well-known SID):

S-1-5- {другие части SID} -500

Или, если вы не хотите для разбора строк, вы можете использовать SecurityIdentifier класс:

// Get the built-in administrator account. 
var sid = new SecurityIdentifier(WellKnownSidType.BuiltinAdministratorsSid, 
    null); 

// Compare to the current user. 
bool isBuiltInAdmin = (windowsIdentity.User == sid); 

Howeve r, я подозреваю, что вы действительно хотите знать, является ли текущий пользователь членом администраторов group для локального компьютера. Вы можете получить этот SID с помощью WellKnownSidType из BuiltinAdministratorsSid:

// Get the SID of the admin group on the local machine. 
var localAdminGroupSid = new SecurityIdentifier(
    WellKnownSidType.BuiltinAdministratorsSid, null); 

Затем вы можете проверить Groups property на WindowsIdentity пользователя, чтобы убедиться, что пользователь является членом локальной администратора группы, например, так:

bool isLocalAdmin = windowsIdentity.Groups. 
    Select(g => (SecurityIdentifier) g.Translate(typeof(SecurityIdentifier))). 
    Any(s => s == localAdminGroupSid); 
+2

Проверяет ли текущий пользователь права администратора или процесс работает как администратор?Пользователь, который не является администратором, все еще может запускать процесс как администратор, щелкнув правой кнопкой мыши процесс и выбрав «Запуск от имени администратора». –

+1

@JanTacci Если пользователь щелкает правой кнопкой мыши и выбирает запуск как администратор, тогда процесс выполняется как пользователь из группы администраторов, который был выбран из диалогового окна UAC, который показан, процесс не запускается под зарегистрированным пользователем в этом пункте , – casperOne

+2

является администратором и запускает приложение в качестве администратора, это две разные вещи. Даже если я администратор, я все равно могу запустить приложение без привилегий, что в моей ситуации вызывает у меня проблемы. –

19

Я думаю, что это хороший простой механизм.

using System.Security.Principal; 

WindowsIdentity identity = WindowsIdentity.GetCurrent(); 
WindowsPrincipal principal = new WindowsPrincipal(identity); 
bool isAdmin = principal.IsInRole(WindowsBuiltInRole.Administrator); 
0

Я чувствовал, что важно отметить трудности, я имел в попытке использовать WellKnownSidType.BuiltinAdministratorsSid в ответ casperOne в выше. Согласно WellKnownSiDType MSDN, BuiltinAdministratorsSid «Указывает SID, который соответствует учетной записи администратора». Поэтому я ожидал бы, что код casperOne будет работать, и предположим, что это может произойти в некоторых средах. К сожалению, это не было на моей Windows 2003 с .NET 2.0 (устаревший код). Он фактически вернул S-1-5-32-544, который, согласно this article, является sid для администраторов group. Таким образом, сравнение не подходит для меня. Мне нужно будет выполнить собственное сравнение строк для startswith «S-1-5-21» (что kb 243330 указывает, что «21» включен, даже если упомянутый выше блог не работает) и заканчивается «500».

2

Вот один лайнер, чтобы сделать это.

using System.Security.Principal; 

static bool IsElevated => new WindowsPrincipal(WindowsIdentity.GetCurrent()).IsInRole(WindowsBuiltInRole.Administrator);