UAC über .bat-Datei erhöhen?


10

Ziemlich einfach, auf die ich keine Antwort finden kann.

Mit serverfault konnte ich zuvor einen Weg finden, Windows-Updates ohne Verwendung von WSUS zu automatisieren. Es funktioniert fantastisch, aber um es über das Netzwerk auszuführen, müssen Sie zuerst ein freigegebenes Laufwerk bereitstellen. Das ist ziemlich einfach XP, da Sie nur das Laufwerk mounten und den Updater ausführen.

Unter Vista und W7 muss dies alles mit erhöhten Berechtigungen erfolgen, um ordnungsgemäß zu funktionieren. Das UAC-Konto kann keine Netzwerklaufwerke sehen, die vom normalen Benutzer bereitgestellt wurden. Damit alles funktioniert, muss ich die Freigabe über net useeine eskalierte Shell bereitstellen. Ich möchte das Mounten dieser Freigabe und das Starten des Updaters über eine einfache .bat-Datei automatisieren.

Ich könnte wahrscheinlich jeden anweisen, mit der rechten Maustaste auf "Als Administrator ausführen" in der .bat-Datei zu klicken, aber ich möchte die Dinge so einfach wie möglich halten und die .bat den Benutzer automatisch auffordern, ihre Berechtigungen zu erweitern.

Da diese Computer nicht zu uns gehören, kann ich nicht mit der Installation von Powershell rechnen, sodass jede Lösung in dieser Richtung ausfällt und sich auf Dinge verlassen muss, die in einer RTM Vista-Installation enthalten wären. Ich hoffe, ich vermisse hier meistens etwas Offensichtliches. :) :)

Antworten:


8

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

BEARBEITEN: Wenn Sie dem Kunden eine einzelne Datei zum Ausführen geben, können Sie mit WinRAR eine selbstextrahierende RAR erstellen und in den SFX-Optionen das Flag "Administrator erforderlich" setzen. Dies befreit Sie von Ihrem Limit von nur 1 Datei, Sie können alle Ressourcen haben, die Sie benötigen.

Alternativ können Sie Ihre SFX mit Ihrem bevorzugten SFX-Tool erstellen und die oben genannten Erhöhungswerkzeuge verwenden.


Ich werde dies berücksichtigen, aber ich versuche erneut, zusätzliche Installationen zu vermeiden, da diese Maschinen Dritten gehören.
Jslaker

Ich glaube, Sie können sie verwenden, ohne sie zu installieren. Packen Sie sie einfach neben Ihre Batch-Datei.
ta.speot.is

Es gibt mehrere Dateien im Download, aber es sieht aus wie alles , was Sie brauchen würden für Ihre Anforderung sein würde elevate.cmdundelevate.vbs
bis auf weiteres unterbrochen.

Wenn ich das alles ziemlich eigenständig / tragbar verpacken kann, kann es funktionieren. Ich werde es mir genauer ansehen, wenn ich heute etwas mehr Zeit habe.
Jslaker

Während dies theoretisch die Frage beantworten kann, wäre es vorzuziehen , die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz bereitzustellen.
Mark Henderson

4

Wenn Sie bereit sind, auf PowerShell zu konvertieren, ist dies viel einfacher. Dies ist mein " Elevate-Process.ps1" Skript (mit suals Alias ​​in meinem Profil):

# 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

Die Erkennung einer Erhöhung kann auch in PSH erfolgen (daher können Sie die Höhe überprüfen und bei Bedarf erhöhen):

$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
}

Ich dachte mir, dass Powershell dies kann, aber ich kann mich auch hier nicht darauf verlassen, dass Powershell installiert wird, und brauche etwas so Feuer und Vergessen wie möglich.
Jslaker

@jslaker: Das kann sicherlich ein Problem mit Vista / 2008 sein. PSH ist jedoch in Win7 / 2008R2 enthalten, sodass dies einfacher werden sollte. Könnte dies in einer Unternehmenssituation der Antrieb für eine Einführung sein?
Richard

Nun, es ist keine Unternehmenssituation. Die ursprüngliche Frage, die ich verlinkt habe, enthält mehr, aber die Kurzversion besagt, dass wir eine PC-Reparaturwerkstatt sind, und dies alles versucht im Grunde zu umgehen, dass die WSUS-Lizenz Ihnen verbietet, WSUS zum Bereitstellen von Updates auf Computern zu verwenden, die dies nicht sind lizenziert an Ihre Organisation. Dies sind alles Kundencomputer, auf denen ab XP RTM alles ausgeführt werden kann. Aus diesem Grund kann ich mich nicht wirklich darauf verlassen, dass etwas installiert wird, das in einer RTM-Installation eines bestimmten Betriebssystems nicht enthalten wäre.
Jslaker

Wenn Sie sich nicht darauf verlassen können, dass Powershell installiert wird, lesen Sie die Antwort, die ich unten gegeben habe.
Matt

3

Hier ist ein Beispielskript, das ich mir ausgedacht habe. Ich hoffe, es hilft anderen. Es ist eine Bat-Datei, die den Benutzer zur Erlaubnis auffordert und sich dann selbst eskaliert. Es leitet ein vbscript weiter, das die UAC-Eingabeaufforderung auslöst, und führt dann die bat-Datei mit erhöhten Rechten erneut aus ... http://jagaroth.livejournal.com/63875.html



1

FusionInventory.org ist eine Open-Source-Lösung, die hauptsächlich von kleinen Reparaturwerkstätten verwendet wird. Es kann wie Ihr persönlicher ferngesteuerter Windows-Updater sein.


0

Keine dieser Lösungen funktioniert für eine CMD-Datei, die die Befehlszeilenparameter kennen muss. Fügen Sie dies ganz am Anfang der .cmd-Datei ein und alle Ihre Probleme werden gelöst. (Dies ist für zukünftige Leute, die diesen Thread durchsuchen [Ich habe dies unter Windows XP, 7 Vista und 8; x86 + x64 getestet]):

@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

Wie @emilio sagte, ist dieses Skript in Ordnung, akzeptiert jedoch keine Argumente. Hier das modifizierte Skript, um mit Argumenten kompatibel zu sein:

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


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.