web-dev-qa-db-ja.com

.batファイル経由でUACを昇格しますか?

私が答えを見つけるのに苦労しているかなり簡単なもの。

serverfault 以前は私を助けました WSUSを使用せずにWindowsの更新を自動化する方法を見つけました。これはすばらしい動作をしていますが、ネットワーク経由で実行するには、最初に共有ドライブをマウントする必要があります。ドライブをマウントしてアップデータを実行するだけなので、これは非常に簡単ですXP.

ただし、VistaおよびW7では、正常に機能させるために、これらすべてを管理者特権で実行する必要があります。 UACアカウントは、通常のユーザーによってマウントされたネットワークドライブを認識できないため、すべてを機能させるために、エスカレーションされたシェルからNet Useを介して共有をマウントする必要があります。この共有のマウントと単純な.batファイルを介したアップデーターの起動を自動化したいと思います。

おそらく、.batファイルで[管理者として実行]を右クリックするようにすべての人に指示することもできますが、できるだけ単純にして、.batで自動的にユーザーに権限の昇格を促すようにしたいと思います。

これらのコンピューターは私たちのものではないので、Powershellのようなものをインストールすることはできません。そのため、これらのラインに沿ったソリューションはすべてルール化され、RTM Vistaのインストール。ここに明らかなものがほとんど欠けているといいのですが:)

10
jslaker

http://technet.Microsoft.com/en-us/magazine/2007.06.utilityspotlight.aspx

編集:実行する単一のファイルを顧客に提供する場合は、WinRARを使用して自己抽出RARを作成し、SFXオプションに「管理者が必要」フラグを設定してみませんか?これにより、ファイルが1つしかないという制限がなくなり、必要なすべてのリソースを利用できます。

または、お気に入りのSFXツールを使用してSFXを作成し、上記の昇格ツールを使用します。

8
ta.speot.is

PowerShellに変換する準備ができている場合、これははるかに簡単です。これは私の "Elevate-Process.ps1 "スクリプト(マイプロファイルのエイリアスとしてsuを使用):

# Updated elevate function that does not need Elevate PowerToys
# From http://devhawk.net/2008/11/08/My+ElevateProcess+Script.aspx


$psi = new-object System.Diagnostics.ProcessStartInfo
$psi.Verb = "runas"

# If passed multiple commands, or one (that isn't a folder) then execute that command:
if (($args.Length -gt 1) -or (($args.length -eq 1) -and -not (test-path $args[0] -pathType Container))) {

    $file, [string]$arguments = $args;
    $psi.FileName = $file  
    $psi.Arguments = $arguments
    [System.Diagnostics.Process]::Start($psi) | out-null
    return
}

# If from console Host, handle case of one argyment that is
# a folder, to start in that folder. Otherwise start in current folder.
if ($Host.Name -eq 'ConsoleHost') {
    $psi.FileName = (Get-Command -name "PowerShell").Definition
    if ($args.length -eq 0) {
        $psi.Arguments = "-NoExit -Command &{set-location '" + (get-location).Path + "'}"
    } else {
        $psi.Arguments = "-NoExit -Command &{set-location '" + (resolve-path $args[0]) + "'}"
    }
    [System.Diagnostics.Process]::Start($psi) | out-null
    return
}

# Otherwise this is some other Host (which cannot be assumed to take parameters).
# So simplely launch elevated.
$psi.FileName = [system.diagnostics.process]::getcurrentprocess().path
$psi.Arguments = ""
[System.Diagnostics.Process]::Start($psi) | out-null

昇格の検出はPSHでも実行できます(したがって、昇格を確認し、必要に応じて昇格できます)。

$wid=[System.Security.Principal.WindowsIdentity]::GetCurrent()
$prp=new-object System.Security.Principal.WindowsPrincipal($wid)
$adm=[System.Security.Principal.WindowsBuiltInRole]::Administrator
$IsAdmin=$prp.IsInRole($adm)
if ($IsAdmin) {
  $Host.UI.RawUI.Foregroundcolor="Red"
  write-Host "`n** Elevated Session **`n" -foreground $_errorColour -background $_errorBackound
}
4
Richard

これは私が思いついたスクリプトの例です。他の人の役に立つことを願っています。これは、ユーザーに許可を求めてから自分自身をエスカレートするbatファイルです。 UACプロンプトをトリガーするいくつかのvbscriptをパイプで取り出し、昇格したbatファイルを再実行します... http://jagaroth.livejournal.com/63875.html

3
TheThing
2
Emilio

FusionInventory.orgは、小規模な修理工場で主に使用されているオープンソースソリューションです。個人的にリモート制御されるWindowsアップデーターのようなものです。

1
rjt

Powershellのインストールに依存できない場合は、StackOverflowでこのソリューションを使用できます。

バッチファイルを使用してUACで自動昇格

インストールする必要がなく、そのまま実行できます。コマンドライン引数を保存する必要がある場合this updateを検討してください。

0
Matt

@emilioが言ったように、そのスクリプトは問題ありませんが、引数を受け入れません。ここで、引数と互換性があるように変更されたスクリプト:

:: BatchGotAdmin
:-------------------------------------
REM  --> Check for permissions
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"

REM --> If error flag set, we do not have admin.
if '%errorlevel%' NEQ '0' (
    echo Requesting administrative privileges...
    goto UACPrompt
) else ( goto gotAdmin )

:UACPrompt
    echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
    echo args = "" >> "%temp%\getadmin.vbs"
    echo For Each strArg in WScript.Arguments >> "%temp%\getadmin.vbs"
    echo args = args ^& strArg ^& " "  >> "%temp%\getadmin.vbs"
    echo Next >> "%temp%\getadmin.vbs"
    echo UAC.ShellExecute "%~s0", args, "", "runas", 1 >> "%temp%\getadmin.vbs"

    "%temp%\getadmin.vbs" %*
    exit /B

:gotAdmin
    if exist "%temp%\getadmin.vbs" ( del "%temp%\getadmin.vbs" )
    pushd "%CD%"
    CD /D "%~dp0"
:--------------------------------------
0
TanisDLJ

これらのソリューションはいずれも、コマンドラインパラメータを認識する必要がある.cmdファイルに対して機能しません。これを.cmdファイルの最初に置くと、すべての問題が解決されます。 (これは、このスレッドを閲覧する将来の人々のためのものです[私はこれをWindows XP、7 Vistaおよび8; x86 + x64でテストしました]):

@echo off
NET SESSION >nul 2>&1 && goto noUAC
title.
set n=%0 %*
set n=%n:"=" ^& Chr(34) ^& "%
echo Set objShell = CreateObject("Shell.Application")>"%tmp%\cmdUAC.vbs"
echo objShell.ShellExecute "cmd.exe", "/c start " ^& Chr(34) ^& "." ^& Chr(34) ^& " /d " ^& Chr(34) ^& "%CD%" ^& Chr(34) ^& " cmd /c %n%", "", "runas", ^1>>"%tmp%\cmdUAC.vbs"
echo Not Admin, Attempting to elevate...
cscript "%tmp%\cmdUAC.vbs" //Nologo
del "%tmp%\cmdUAC.vbs"
exit /b
:noUAC

::-----Normal Batch Starts Here---------------------
0
Grintor