Как запросить повышения прав пользователя. Например если это инсталятор службы, то функция установки даёт ошибку - не хватает прав. Многие инсталяторы делают это обычным диалогом при запуске. Т.е. окно на весь экран с двумя полями: логин и пароль. Думаю каждый кто работает из-под пользователя знает это окно. Если работа идет из-под администратора (не корневого) то в окне две кнопки - да и нет. Как такое сделать на с#?
Возможны варианты
Вариант с перезапуском, проверить
static internal bool IsRunAsAdmin()
{
WindowsIdentity id = WindowsIdentity.GetCurrent();
WindowsPrincipal principal = new WindowsPrincipal(id);
return principal.IsInRole(WindowsBuiltInRole.Administrator);
}
и перезагрузить программу выполнив
ProcessStartInfo proc = new ProcessStartInfo();
proc.UseShellExecute = true;
proc.WorkingDirectory = Environment.CurrentDirectory;
proc.FileName = Application.ExecutablePath;
proc.Verb = "runas";
try
{
Process.Start(proc);
Application.Exit(); // Завершить текущую.
}
catch
{
}
Ресурс RT_MANIFEST долен сожержать
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
<requestedPrivileges>
<requestedExecutionLevel
level="requireAdministrator"
/>
</requestedPrivileges>
</security>
</trustInfo>
Через студию можно так (цитата): Чтобы настроить уровень повышения привилегий в данном проекте Visual C# Windows Forms, откройте свойства проекта, перейдите на вкладку «Безопасность», поставьте флажок напротив пункта «Включить параметры безопасности ClickOnce-приложений», выберите «Это приложение с полным доверием», а затем закройте страницу Свойства приложения. Это приведет к созданию файла app.manifest и настроит проект для встраивания манифеста. Вы можете открыть файл "app.manifest" в обозревателе решений, развернув папку Свойства. В файле содержится следующее содержимое по умолчанию. Строку
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
Заменить asInvoker
на requireAdministrator
(Ошибочный) Если есть учётка (логин пароль) или её токен, то можно применить учетку.
WindowsIdentity newId = new WindowsIdentity(_tokenHandle);
WindowsImpersonationContext ctx= newId.Impersonate();
....
ctx.Undo(); // отменить действие учётки
А далее возможны варианты. Получить токен можно так http://stackoverflow.com/a/35426713/5727271 (тут не хватает Undo).
Админская учётка может не иметь полных прав, даже если извесны логин и пароль. Полные права можно получить через UAC (1 и 2).
Думаю если программа будет странным способом клянчить учётку - не вариант. Возможно вариант подойдет, если где-то шифровано её хранить.
P.S. Проанализировал как это делают FAR и Total - там принцип тот же что в [1], но чуть усложнили. Когда происходит security-error - запускается вторая копия приложения (с повышением привелегий, при этом появляется диалог). Потом с второй копией программы устанавливается связь, и прилегивированую операцию делает вторая копия, а первая используется как "консоль".
Ссылки
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Проблема в следующем: Имеются в БД таблицы со связью некоторых таблиц многие ко многим (Отображу в виде классов EntityFramework):
Есть DataGrid, ItemsSource которого является List<Author>В классе Author есть публичное свойство List<Book>
Есть кнопка которая при нажатии запускает действие, и при повторном нажатии останавливает