2

我需要向我的 C# WPF 应用程序添加一个函数来修复某些注册表项。这将通过调用来完成regsvr32.exe /s mylib.dll。现在,从我看到的使用runas带有新Process对象的动词来看,这应该很容易做到。(我的 dll 确实需要管理员权限,因为它写入了一些注册表项。)

但问题是有多个 DLL,因此会多次调用regsvr32.exe,并且不可能将所有注册放入单个.dll. 但是如果我只是runas多次,用户会在我启动它时获得尽可能多的 UAC 对话框......我不希望这样。

我只想要一个对话框,我真的很想避免有一个神秘的额外fixer.exe文件来代替启动。现在,我只知道非常基本的 Windows 安全知识,但不应该以某种方式获得“管理员”令牌(这让我得到 UAC 对话框)并使用它来启动不同的进程吗?

4

3 回答 3

1

您可以只使用命令行参数,并使用 shell 到您自己的 .exe 以管理员身份运行该进程。当你的应用程序加载时,检查那些命令行参数......如果它们在那里,注册你所有的 dll,然后退出。

或者,您可以编写一个批处理文件来注册所有 dll,并使用管理员权限对其进行 shell。

于 2010-12-18T18:32:05.090 回答
0

这里的问题是安全性。你有三个选择:

  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 来准备每台机器?

于 2010-12-18T22:35:26.180 回答
0

如果您只需要一个 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 对话框只会出现一次。

于 2013-04-05T21:18:09.930 回答