2

特定のレジストリエントリを修正するために、C#WPFアプリケーションに関数を追加する必要があります。これは、を呼び出すことによって行われregsvr32.exe /s mylib.dllます。さて、これは、新しいオブジェクトrunasで動詞を使用して私が見たものから簡単に実行できるはずです。Process(私のdllは、書き込むレジストリキーがいくつかあるため、管理者権限が必要です。)

ただし、問題は複数のDLLが存在するため、の呼び出しが複数ありregsvr32.exe、すべての登録を1つにまとめることができないこと.dllです。しかし、私がrunas何度も行った場合、ユーザーは私が開始したのと同じ数のUACダイアログを取得することになります...そして私はそれを望んでいません。

fixer.exeダイアログが1つだけ必要ですが、代わりに起動を実行するためにミステリーの余分なファイルが必要になるのを本当に避けたいと思います。今、私は本当に基本的なレベルでWindowsセキュリティに関するものしか知りませんが、何らかの方法で「admin」トークンを取得し(UACダイアログを取得します)、それを使用してさまざまなプロセスを起動することはできませんか?

4

3 に答える 3

1

コマンドライン引数を使用して、そのプロセスを管理者として実行している独自の.exeにシェルすることができます。アプリケーションがロードされたら、それらのコマンドライン引数を確認します...それらが存在する場合は、すべてのdllを登録して、終了します。

または、すべてのdllを登録するバッチファイルを作成し、管理者権限でそのファイルにシェルすることもできます。

于 2010-12-18T18:32:05.090 に答える
0

ここでの問題はセキュリティです。3つのオプションがあります。

  1. サービスアカウントを作成し、サービスアカウント権限でアプリケーションを実行します。
  2. アプリケーションを実行するターゲットマシンに、ある種のインストールパッケージを準備します。
  3. PowerShellを使用して、管理者権限->を使用してzippy32.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')
}

dllの登録はインストール手順以上のものであるため、オプション2を選択します。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ダイアログは1回だけ表示されます。

于 2013-04-05T21:18:09.930 に答える