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


10

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

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

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

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

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

回答:


8

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

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

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


私はこれを心に留めておきますが、これらのマシンはサードパーティに属しているので、余分なものをインストールしないようにしています。
jslaker

私はあなたがそれらをインストールせずにそれらを使うことができると信じています、ちょうどあなたのバッチファイルのそばにそれらをパッケージ化してください。
ta.speot.is

そこダウンロードにはいくつかのファイルがありますが、それはあなたの条件になりますのためにあなたが必要があると思い、すべてのように見えるelevate.cmdelevate.vbs
追って通知があるまで一時停止しました。

これをかなりスタンドアロン/ポータブルにパッケージ化できれば、うまくいくかもしれません。今日はもう少し時間があれば、詳しく見ていきます。
jslaker

これは理論的には質問に答える可能性がありますが、答えの本質的な部分をここに含め、参照用のリンクを提供することが望ましいでしょう
マークヘンダーソン

4

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
}

私はPowershellがこれを行うことができると考えましたが、ここでも、Powershellのインストールに依存することはできず、火のように何かを必要とし、できるだけ忘れます。
jslaker

@jslaker:Vista / 2008では問題になる可能性があります。ただし、PSHはWin7 / 2008R2に含まれているため、簡単に使用できます。企業の状況では、これがロールアウトの原動力になるのでしょうか?
Richard

まあ、それは企業の状況ではありません。リンクした元の質問には他にもありますが、短いバージョンはPCの修理工場であることです。これは基本的に、WSUSライセンスがWSUSを使用していないマシンに更新を展開することを禁止していることを回避しようとするものです組織にライセンスされています。これらはすべて、XP RTMから何でも実行できる顧客のマシンです。これが、特定のOSのRTMインストールに含まれていないもののインストールにはまったく依存できない理由です。
jslaker

インストールされているPowershellに依存できない場合は、以下の回答を確認してください。
Matt

3

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


2

これが必要なものです:http : //sites.google.com/site/eneerge/home/BatchGotAdmin


1
このスクリプトにはマイナーなバグがあり、パラメーターを転送しません。次のようにスクリプトを呼び出すためのコマンドにそれらを入力するだけです:echo UAC.ShellExecute "%〜s0"、 "%*"、 ""、 "runas"、1 >> "%temp%\ getadmin.vbs"
SvenS

1

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


0

これらのソリューションはいずれも、コマンドラインパラメーターを認識する必要がある.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

@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"
:--------------------------------------


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.