Среда выполнения 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