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. :) :)

jslaker
quelle

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.

ta.speot.is
quelle
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
}
Richard
quelle
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

Die Sache
quelle
2

Folgendes benötigen Sie: http://sites.google.com/site/eneerge/home/BatchGotAdmin

Emilio
quelle
1
Dieses Skript hat einen kleinen Fehler, es leitet keine Parameter weiter. Fügen Sie sie einfach in den Befehl zum Aufrufen Ihres Skripts wie folgt ein: echo UAC.ShellExecute "% ~ s0", "% *", "", "runas", 1 >> "% temp% \ getadmin.vbs"
SvenS
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.

rjt
quelle
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---------------------
Grintor
quelle
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"
:--------------------------------------
TanisDLJ
quelle
-1

Haben Sie den runasBefehl ausprobiert ?

Bis auf weiteres angehalten.
quelle