繁体   English   中英

以管理员身份运行多个应用

[英]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对话框将只出现一次。

这里的问题是安全性。 您有三种选择:

  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来为每台计算机做准备吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM