Как я могу предотвратить запуск моей программы, если она не запущена в административном режиме?XP и Windows 7 - PullRequest
3 голосов
/ 21 января 2012

У меня есть программа на C #, которая должна быть совместима с несколькими ОС.Требуется доступ для создания каталога и получения данных WMI, но он доступен только в том случае, если программа запускается от имени администратора.В противном случае произойдет сбой.

Есть ли какая-либо команда, которую я могу использовать, чтобы не запускать программу, если она не обнаруживает себя запущенной от имени администратора?Я попытался добавить app.manifest и использовать «requireAdministrator», он запрашивает логин, но, похоже, работает только в Windows 7 и Vista, а не в XP.

Пример:

 if (isAdmin==0)
 Console.WriteLine("Please run this as an administrator");
 exit;

Ответы [ 2 ]

5 голосов
/ 21 января 2012

Проверьте, является ли пользователь администратором

public static bool IsAdministrator()
{
    WindowsIdentity windowsIdentity = WindowsIdentity.GetCurrent();
    WindowsPrincipal windowsPrincipal = new WindowsPrincipal(windowsIdentity);

    return windowsPrincipal.IsInRole(WindowsBuiltInRole.Administrator);
}

Перезапустите приложение, если не администратор

public static bool RestartAsAdministrator(string filePath, string fileName, string errorCaption)
{
    Process process = null;
    ProcessStartInfo processStartInfo = new ProcessStartInfo();
    processStartInfo.FileName = Path.Combine(filePath, fileName);

    if (Environment.OSVersion.Version.Major >= 5) //5 is XP and 6 is Vista and 7
        processStartInfo.Verb = "runas";

    processStartInfo.Arguments = "";
    processStartInfo.WindowStyle = ProcessWindowStyle.Normal;
    processStartInfo.UseShellExecute = true;

    try
    {
        process = Process.Start(processStartInfo);
    }

    catch (Exception)
    {
        MessageBox.Show("Couldn't start as admin.\nPlease try manually by Right Clicking on " + Path.GetFileNameWithoutExtension(fileName) + " and selecting \"Run as administrator\"",
                            errorCaption + " Error", MessageBoxButton.OK, MessageBoxImage.Error);

        return false;
    }

    finally
    {
        if (process != null)
            process.Dispose();
    }

    return true;
}

Файл манифеста приложения (используется для автоматического запуска от имени администратора)

<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
3 голосов
/ 21 января 2012

Вы можете использовать эту функцию, чтобы проверить, имеет ли текущий пользователь (который запускает ваше приложение) права администратора.

using System.Security.Principal;
...
bool IsAnAdministrator ()
{
   WindowsIdentity  identity = WindowsIdentity.GetCurrent();
   WindowsPrincipal principal = new WindowsPrincipal (identity);
   return principal.IsInRole(WindowsBuiltInRole.Administrator);
}

Если вы вызываете этот метод и он возвращает false, вы можете показать сообщение/ или закройте вашу заявку.

...