Запуск нескольких приложений в качестве администратора - PullRequest
2 голосов
/ 18 декабря 2010

Мне нужно добавить функцию в мое приложение C # WPF, чтобы исправить некоторые записи в реестре.Это можно сделать, позвонив по номеру regsvr32.exe /s mylib.dll.Теперь это должно быть легко сделать из того, что я вижу, используя глагол runas с новым объектом Process.(Моя dll требует прав администратора из-за некоторых ключей реестра, в которые она записывает.)

Но проблема в том, что существует несколько библиотек DLL, поэтому несколько вызовов regsvr32.exe, и невозможно поставить все регистрациив один .dll.Но если бы я просто runas несколько раз, пользователь получил бы столько диалогов UAC, сколько я запустил ... и я этого не хочу.

Мне нужен только один диалог, и я действительнодействительно хочу избежать наличия загадочного дополнительного файла fixer.exe, чтобы вместо этого делать запуск.Теперь я знаю материал по безопасности Windows только на самом базовом уровне, но разве нельзя как-то получить токен «admin» (который выводит меня в диалог UAC) и использовать его для запуска различных процессов?

Ответы [ 3 ]

1 голос
/ 18 декабря 2010

Вы можете просто использовать аргументы командной строки и shell для вашего собственного .exe, запускающего этот процесс в качестве администратора.Когда ваше приложение загружается, проверьте эти аргументы командной строки ... Если они есть, зарегистрируйте все ваши dll, затем выйдите.

Или вы можете написать командный файл, который регистрирует все библиотеки DLL, и подключить к нему с правами администратора.

0 голосов
/ 06 апреля 2013

Если вам нужна только одна подсказка UAC, ответ на Stackoverflow уже есть, посмотрите здесь .

Этот сценарий повышает свой уровень один раз, и вы можете выполнить последовательность команд, для которых всем требуются повышенные права, поэтому вы больше не получаете несколько запросов UAC.

В вашем случае это означает, что выможно просто добавить вызовы

regsvr32.exe /s mylib1.dll
regsvr32.exe /s mylib2.dll
regsvr32.exe /s mylib3.dll

в конце скрипта, упомянутого выше, то есть

:::::::::::::::::::::::::::::::::::::::::
:: Automatically check & get admin rights
:::::::::::::::::::::::::::::::::::::::::
@echo off
CLS 
ECHO.
ECHO =============================
ECHO Running Admin shell
ECHO =============================

:checkPrivileges 
NET FILE 1>NUL 2>NUL
if '%errorlevel%' == '0' ( goto gotPrivileges ) else ( goto getPrivileges ) 

:getPrivileges 
if '%1'=='ELEV' (shift & goto gotPrivileges)  
ECHO. 
ECHO **************************************
ECHO Invoking UAC for Privilege Escalation 
ECHO **************************************

setlocal DisableDelayedExpansion
set "batchPath=%~0"
setlocal EnableDelayedExpansion
ECHO Set UAC = CreateObject^("Shell.Application"^) > "%temp%\OEgetPrivileges.vbs" 
ECHO UAC.ShellExecute "!batchPath!", "ELEV", "", "runas", 1 >> "%temp%\OEgetPrivileges.vbs" 
"%temp%\OEgetPrivileges.vbs" 
exit /B 

:gotPrivileges 
::::::::::::::::::::::::::::
:START
::::::::::::::::::::::::::::
setlocal & pushd .

REM The following code will cause Windows UAC to prompt only once 

regsvr32.exe /s mylib1.dll
regsvr32.exe /s mylib2.dll
regsvr32.exe /s mylib3.dll

, и диалог UAC появится только один раз.

0 голосов
/ 19 декабря 2010

Проблема здесь в безопасности.У вас есть три варианта:

  1. Создать учетную запись службы и запустить приложение с правами учетной записи службы.
  2. Подготовьте целевые машины, на которых приложение будет работать, с каким-либо инсталляционным пакетом.
  3. Используйте PowerShell для запуска regsvr32.exe с правами администратора ->
function Run-Elevated ($scriptblock)
{
  # TODO: make -NoExit a parameter
  # TODO: just open PS (no -Command parameter) if $sb -eq ''
  $sh = new-object -com 'Shell.Application'
  $sh.ShellExecute('powershell', "-NoExit -Command $sb", '', 'runas')
}

Я бы выбрал вариант 2, так как регистрация DLL болеешаг установки.Регистрация библиотеки DLL пересекает границу привилегий учетной записи, необходимых для запуска основного приложения.Если ваше приложение работает в доменной среде, можно ли использовать MSI для подготовки каждой машины?

...