Среда выполнения C#, повышающая привилегии приложения

Я уже испробовал все возможные решения, описанные на Stackru.com, но не могу заставить приложение работать от имени администратора или запросить права администратора.

Я старался:

  • Создание манифеста с помощью runAs="requireAdministrator"
  • Установка вручную "verb = 'runAs'"

Но каждый экземпляр просто вызывает другой, у которого нет прав, он просто зацикливается.:(

Проект довольно прост, и я не могу найти, что не так.

Не могли бы вы так нежно помочь мне?!

Спасибо!!!

РЕДАКТИРОВАТЬ: зацикливание происходит в Windows 7. В Windows XP он запрашивает разрешение, и даже ввод действительного пользователя / пароля, кажется, не удается. Он не будет зацикливаться, но вызывает только первый экземпляр, который не имеет прав администратора.

РЕДАКТИРОВАТЬ 2: тот же код отлично работает в Windows 8. Windows XP не имеет UAC, поэтому он не будет работать. Проблема сохраняется только в Windows 7.

РЕДАКТИРОВАТЬ 3: После нескольких попыток я пришел к выводу, что с пользователем, установленным с общим профилем "Пользователь" (по умолчанию в Windows), приложение не запрашивает доступ администратора. Это кажется странным, нужно ли иметь профиль администратора, чтобы приложение могло запрашивать доступ администратора?!:S


Мой манифест

<?xml version="1.0" encoding="utf-8"?>
<asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <assemblyIdentity version="1.0.0.0" name="MyApplication.app" />
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
    <security>
      <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
        <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
      </requestedPrivileges>
    </security>
  </trustInfo>
</asmv1:assembly>

Код...

public partial class MainWindow : Window
{
    public MainWindow()
    {
        Juca.raisePermissions();
        InitializeComponent();

        if (Juca.gotPower())
        {
            lblBad.Visibility = Visibility.Hidden;
            lblGreat.Visibility = Visibility.Visible;
        }
        else
        {
            lblBad.Visibility = Visibility.Visible;
            lblGreat.Visibility = Visibility.Hidden;
        }
    }
}

class Juca
{
    public static bool gotPower()
    {
        var IdentidadeWindows = WindowsIdentity.GetCurrent();
        var IdentidadePrincipal = new WindowsPrincipal(IdentidadeWindows);
        return IdentidadePrincipal.IsInRole(WindowsBuiltInRole.Administrator);
    }

    public static void raisePermissions()
    {
        if (!gotPower())
        {
            MessageBox.Show("I shall raise your permissions");

            var processInfo = new ProcessStartInfo(Assembly.GetCallingAssembly().CodeBase);
            processInfo.UseShellExecute = true;
            processInfo.Verb = "runas";
            try
            {
                Process.Start(processInfo);
            }
            catch (Win32Exception ex)
            {
                MessageBox.Show("Could not raise at all... :(");
            }
        }
    }
}

1 ответ

Вы указали глагол "runas" в ProcessStartInfo. "Runas" отображается как "Запуск от имени администратора". Он доступен для учетных записей администраторов. Для обычного профиля пользователя доступен только "runasuser", оболочка откроет диалог входа в систему для ввода имени и пароля учетной записи администратора.

Вы можете проверить глаголы.exe-файла в HKEY_CLASSES_ROOT\exefile\shell

Другие вопросы по тегам