Мое приложение должно запускать некоторые скрипты, и я должен быть уверен, что пользователь, выполняющий их, является администратором ... Каков наилучший способ сделать это с помощью C#?Проверьте, является ли текущий пользователь администратором
ответ
using System.Security.Principal;
public static bool IsAdministrator()
{
WindowsIdentity identity = WindowsIdentity.GetCurrent();
WindowsPrincipal principal = new WindowsPrincipal(identity);
return principal.IsInRole(WindowsBuiltInRole.Administrator);
}
return new WindowsPrincipal(WindowsIdentity.GetCurrent())
.IsInRole(WindowsBuiltInRole.Administrator);
@ Ниссим: Любая крайность может быть плохой, но нам нужно судить о каждом конкретном случае. –
@Nissm: Вы оба ответили одновременно, или около того, что через 5 минут после того, как вы оба указали, что отправили «5 минут назад». Нет причин для атаки Алекса; мы здесь не для того, чтобы заработать репутацию, мы здесь, чтобы помочь. – Randolpho
Что о http://ayende.com/blog/158401/are-you-an-administrator или http://blogs.msdn.com/b/jaredpar/archive/2007/08/01/detecting-if-you -are-an-admin.aspx? Что лучше? – Kiquenet
Просто думал, что я хотел бы добавить еще одно решение; поскольку IsInRole
не всегда работает.
- Если пользователь не является членом указанной группы пользователей Windows в текущем сеансе.
- Администратор внес изменения в параметры групповой политики
- Параметр роли рассматривается как метод «Чувствительность к регистру».
- И если на компьютере с XP нет установленной версии .NET Framework, это не сработает.
В зависимости от ваших потребностей, если вам необходимо поддерживать старые системы; или не уверены в том, как ваш клиент физически управляет вашей системой. Это решение, которое я реализовал; для гибкости и изменений.
class Elevated_Rights
{
// Token Bool:
private bool _level = false;
#region Constructor:
protected Elevated_Rights()
{
// Invoke Method On Creation:
Elevate();
}
#endregion
public void Elevate()
{
// Get Identity:
WindowsIdentity user = WindowsIdentity.GetCurrent();
// Set Principal
WindowsPrincipal role = new WindowsPrincipal(user);
#region Test Operating System for UAC:
if (Environment.OSVersion.Platform != PlatformID.Win32NT || Environment.OSVersion.Version.Major < 6)
{
// False:
_level = false;
// Todo: Exception/ Exception Log
}
#endregion
else
{
#region Test Identity Not Null:
if (user == null)
{
// False:
_level = false;
// Todo: "Exception Log/Exception"
}
#endregion
else
{
#region Ensure Security Role:
if (!(role.IsInRole(WindowsBuiltInRole.Administrator)))
{
// False:
_level = false;
// Todo: "Exception Log/Exception"
}
else
{
// True:
_level = true;
}
#endregion
} // Nested Else 'Close'
} // Initial Else 'Close'
} // End of Class.
Таким образом, приведенный выше код имеет несколько конструкций; он действительно проверит, будет ли пользователь находиться на Vista или выше. Таким образом, если клиент находится на XP без рамки или бета-версии от нескольких лет назад, это позволит вам изменить то, что вы хотели бы сделать.
Затем он будет физически проверять, чтобы избежать нулевого значения для учетной записи.
Затем, в конце концов, он предоставит чек, чтобы убедиться, что пользователь действительно находится в надлежащей роли.
Я знаю, что на вопрос был дан ответ; но я думал, что мое решение станет отличным дополнением к странице для всех, кто ищет Stack. Мое рассуждение о Защищенном конструкторе позволит вам использовать этот класс как Производный класс, который вы могли бы контролировать состояние, когда экземпляр класса создается.
Что о http://ayende.com/blog/158401/are-you-an-administrator или http://blogs.msdn.com/b/jaredpar/archive/2007 /08/01/detecting-if-you-are-an-admin.aspx? Что лучше? – Kiquenet
Вы также можете позвонить в Windows API, чтобы сделать это:
[DllImport("shell32.dll", SetLastError=true)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool IsUserAnAdmin();
который более обобщенно говорит вам, является ли пользователь работает под повышенными правами.
Я должен быть уверен, что пользователь, запускающий их является администратором
Если ваше приложение должно запускаться с правами администратора, это было бы правильно, чтобы обновить его манифест.
requestedExecutionlevel
до requireAdminstrator
.
Вышеуказанные ответы с IsInRole на самом деле правильно: это проверить, если текущий пользователь имеет привилегию администратора.
Начиная с Windows Vista, контроль учетных записей пользователей (UAC) определяет привилегии пользователя.Если вы являетесь членом группы «Встроенные администраторы», вам назначаются два токена доступа во время выполнения: стандартный токен доступа пользователя и токен доступа администратора. По умолчанию вы находитесь в стандартной роли пользователя.
(из MSDN, например, https://msdn.microsoft.com/en-us/library/system.diagnostics.eventlogpermission(v=vs.110).aspx)
Таким образом, IsInRole будет по умолчанию рассматривать привилегии пользователя, и, следовательно, способ вернуть ложь. Верно только тогда, когда программное обеспечение явно запускается как администратор.
Другой метод проверки AD в https://ayende.com/blog/158401/are-you-an-administrator проверяет, находится ли имя пользователя в группе администратора.
Моего метод полного объединения и, таким образом:
public static bool IsCurrentUserAdmin(bool checkCurrentRole = true)
{
bool isElevated = false;
using (WindowsIdentity identity = WindowsIdentity.GetCurrent())
{
if (checkCurrentRole)
{
// Even if the user is defined in the Admin group, UAC defines 2 roles: one user and one admin.
// IsInRole consider the current default role as user, thus will return false!
// Will consider the admin role only if the app is explicitly run as admin!
WindowsPrincipal principal = new WindowsPrincipal(identity);
isElevated = principal.IsInRole(WindowsBuiltInRole.Administrator);
}
else
{
// read all roles for the current identity name, asking ActiveDirectory
isElevated = IsAdministratorNoCache(identity.Name);
}
}
return isElevated;
}
/// <summary>
/// Determines whether the specified user is an administrator.
/// </summary>
/// <param name="username">The user name.</param>
/// <returns>
/// <c>true</c> if the specified user is an administrator; otherwise, <c>false</c>.
/// </returns>
/// <seealso href="https://ayende.com/blog/158401/are-you-an-administrator"/>
private static bool IsAdministratorNoCache(string username)
{
PrincipalContext ctx;
try
{
Domain.GetComputerDomain();
try
{
ctx = new PrincipalContext(ContextType.Domain);
}
catch (PrincipalServerDownException)
{
// can't access domain, check local machine instead
ctx = new PrincipalContext(ContextType.Machine);
}
}
catch (ActiveDirectoryObjectNotFoundException)
{
// not in a domain
ctx = new PrincipalContext(ContextType.Machine);
}
var up = UserPrincipal.FindByIdentity(ctx, username);
if (up != null)
{
PrincipalSearchResult<Principal> authGroups = up.GetAuthorizationGroups();
return authGroups.Any(principal =>
principal.Sid.IsWellKnown(WellKnownSidType.BuiltinAdministratorsSid) ||
principal.Sid.IsWellKnown(WellKnownSidType.AccountDomainAdminsSid) ||
principal.Sid.IsWellKnown(WellKnownSidType.AccountAdministratorSid) ||
principal.Sid.IsWellKnown(WellKnownSidType.AccountEnterpriseAdminsSid));
}
return false;
}
Для пользователя в качестве администратора группы без повышения уровня привилегий (UAC включен), этот метод IsCurrentUserAdmin() возвращает checkCurrentRole: истинно, если checkCurrentRole == лжи, но false, если checkCurrentRole == true
Если вы запустите код, требующий прав администратора, рассмотрите checkCurrentRole == true. В противном случае к этому моменту вы получите исключение безопасности. Поэтому правильный IsInRole логика.
Просто обратите внимание, что вышеуказанное не будет работать, если UAC включен в Vista или Win7; вам нужно будет открыть окно подтверждения UAC и в этом случае повысить права доступа. – MisterZimbu
Что о http://ayende.com/blog/158401/are-you-an-administrator или http://blogs.msdn.com/b/jaredpar/archive/2007/08/01/detecting-if-you -are-an-admin.aspx? Что лучше? – Kiquenet
не работает для меня, получая ложный FY.I я администратор –