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

时间:2010-12-18 18:14:27

标签: c# security uac admin runas

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

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

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

3 个答案:

答案 0 :(得分:1)

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

或者,您可以编写一个注册所有dll的批处理文件,以及具有管理员权限的shell。

答案 1 :(得分:0)

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

  1. 创建服务帐户并使用服务帐户权限运行应用程序。
  2. 使用某种安装包准备运行应用程序的目标计算机。
  3. 使用powershell调用带有管理员权限的regsvr32.exe - >
  4. 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对话框只会出现一次。