[英]Running multiple apps as Admin
我需要向我的C#WPF应用程序中添加一个函数来修复某些注册表项。 这可以通过调用regsvr32.exe /s mylib.dll
来完成。 现在,从将runas
动词与新的Process
对象一起使用时,我应该可以轻松做到这一点。 (由于它写入的某些注册表项,我的dll确实需要管理员权限。)
但是问题在于有多个DLL,因此有多个regsvr32.exe
调用,并且不可能将所有注册都放入单个.dll
。 但被我只是runas
多次,用户会因为我开始它获得尽可能多的UAC对话框......,我不希望出现这种情况。
我只需要一个对话框,我真的很想避免拥有一个神秘的额外fixer.exe
文件来代替启动。 现在,我只真正了解Windows Security的知识,但是难道不应该以某种方式获取“ admin”令牌(这使我获得UAC对话框)并使用它来启动不同的进程吗?
您可以只使用命令行参数,并以管理员身份运行到自己的.exe外壳程序。 应用程序加载时,检查那些命令行参数...如果它们存在,请注册所有dll,然后退出。
或者,您可以编写一个注册所有dll的批处理文件,并使用管理员权限对其进行外壳程序处理。
如果只需要一个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对话框将只出现一次。
这里的问题是安全性。 您有三种选择:
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来为每台计算机做准备吗?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.