我需要在C#WPF应用程序中添加一个函数来修复某些注册表项。
这可以通过调用regsvr32.exe /s mylib.dll
来完成。现在,根据我使用runas
动词看到的新Process
对象,这应该很容易做到。 (由于它写入了一些注册表项,我的dll确实需要管理员权限。)
但问题是有多个DLL,因此多次调用regsvr32.exe
,并且不可能将所有注册放入单个.dll
。但是,如果我只是runas
多次,用户将获得与我启动它一样多的UAC对话框......我不希望这样。
我只想要一个对话框,而且我真的非常想避免使用神秘的额外fixer.exe
文件来进行启动。现在,我只知道基本级别的Windows安全性内容,但是不应该以某种方式获得“管理”令牌(这会让我获得UAC对话框)并使用它来启动不同的进程吗?
答案 0 :(得分:1)
您可以使用命令行参数和shell作为管理员运行该进程的自己的.exe。当你的应用程序加载时,检查那些命令行参数......如果它们在那里,注册你的所有dll,然后退出。
或者,您可以编写一个注册所有dll的批处理文件,以及具有管理员权限的shell。
答案 1 :(得分:0)
这里的问题是安全性。您有三种选择:
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来准备每台计算机吗?
答案 2 :(得分:0)
如果只需要一个UAC提示,则Stackoverflow上已有答案,请查看here。
此脚本自我提升一次,您可以执行一系列所有需要提升权限的命令,因此您不会再获得多个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对话框只会出现一次。