evinben
Goto Top

Batch per Verknüpfung mit erhöhten Rechten (z. B. als Administrator) ausführen, allerdings dabei den Pfad in !Ausführen in! nicht ignorieren.

OS = WINDOWS 7

Das Verzeichnis in "Ausführen in" wird ignoriert, wenn Batch über Verknüpfung als Administrator ausgeführt wird.
Batch-Datei über Verknüpfung mit erhöhten Rechten starten, wobei das Arbeitsverzeichnis in "Ausführen in“ nicht ignorieren.

Hallo,

wenn über eine Verknüpfung eine Batch-Datei mit erhöhten Rechten – und genauer mit der Option „Als Administrator ausführen“ - gestartet wird, dann wird das Verzeichnis in „Ausführen in“ (das unter Eigenschaften der Verknüpfung gesetzt ist) ignoriert und es wird stattdessen jeweils auf das Arbeitsverzeichnis „%windir%\System32“ zugegriffen.

Meine bisherigen Versuche:
Wenn im Batch PushD %~dp0 oder cd /d "%~dp0" hinzugefügt wird, dann verschlimmert es sich sogar: selbst mit normalen Benutzer-Rechten wird der Batch jeweils in demjenigen Arbeitsverzeichnis ausgeführt, in welchem sich die Batch-Datei befindet, aber nicht in dem gewünschten, das in „Ausführen in“ angegeben ist.
Mir runas.exe habe ich ebenso experimentiert, allerdings wird das Verzeichnis in „Ausführen in“ der Verknüpfung nicht mitberücksichtigt.

Schon längst stolpere ich über dieses Problem, sodass ich mir es nun vorgenommen habe dem einen Schluss zu ziehen.

Vielen Dank für eure Vorschläge!

Gruß
evinben

Content-ID: 182877

Url: https://administrator.de/contentid/182877

Ausgedruckt am: 22.11.2024 um 21:11 Uhr

bastla
bastla 30.03.2012 um 23:03:42 Uhr
Goto Top
Hallo evinben!

Hinsichtlich
Wenn im Batch PushD %~dp0 oder cd /d "%~dp0" hinzugefügt wird, dann verschlimmert es sich sogar: selbst mit normalen Benutzer-Rechten wird der Batch jeweils in demjenigen Arbeitsverzeichnis ausgeführt, in welchem sich die Batch-Datei befindet
In diesem Fall gilt doch "Works as designed" (da ja "%0" die aufgerufene Batchdatei repräsentiert) ...
Als Workaround würde sich anbieten, den gewünschten Pfad einfach als Aufrufparameter mitzuliefern (einmal musst Du ihn in der Verknüpfung ohnehin eintragen) oder, falls ohnehin eine Datei oder ein Ordner als Parameter übergeben wird, deren Pfad (also zB "%~dp1") zu verwenden ...

Grüße
bastla
rubberman
rubberman 30.03.2012 um 23:41:39 Uhr
Goto Top
Hallo evinben,

darüber bin ich auch schon gestolpert. Wenn man ein bisschen im Internet stöbert, dann findet man einige Kommentare von M$, die diese Sache mit der Vermeidung von Sicherheitslücken begründen. Ist also so gewollt.
Wie bastla schon erwähnt hat, übergib den Pfad als Argument. Das kannst du direkt in die Verknüpfung implementieren. Die aufwändigere Variante (die aber auch kein besseres Ergebnis liefert) ist das Auslesen des Arbeitsverzeichnisses aus der Verknüpfung.

RunAsAdmin.vbs
If WScript.Arguments.Count = 0 Then WScript.Quit
Set objFSO = CreateObject("Scripting.FileSystemObject")  
If LCase(objFSO.GetExtensionName(WScript.Arguments(0))) = "lnk" And objFSO.FileExists(WScript.Arguments(0)) Then  
  Set objLnk = CreateObject("WScript.Shell").CreateShortcut(WScript.Arguments(0))  
  arg = objFSO.GetFolder(objLnk.WorkingDirectory).ShortPath
  CreateObject("Shell.Application").ShellExecute objLnk.TargetPath, arg, , "runas", objLnk.WindowStyle  
  Set objLnk = Nothing
End If
Set objFSO = Nothing
Nun kannst du per Drag/Drop eine Verknüpfung zu deinem Batch auf dieses Script ziehen, das UAC promptet dich wie gewohnt an und das Arbeitsverzeichnis wird als Parameter an deinen Batch übergeben (der aber trotzdem zunächst im System32 Verzeichnis startet). Ebenso könntest du das Script natürlich auch in das SendTo Verzeichnis legen. Der leere Parameter der ShellExecute Methode würde eigentlich das Arbeitsverzeichnis beschreiben, wird aber durch das "runas" Verb ignoriert face-sad

Grüße
rubberman
evinben
evinben 31.03.2012 um 08:15:49 Uhr
Goto Top
Hallo bastla und rubberman,

beide Varianten habe ich nicht hinbekommen.

Wenn ich im Ziel der Verknüpfung den Pfad mit dem Argument so eintrage
"C:\Probe\Meine Batch Datei.bat" "C:\Probe\Arbeitsverzeichnis"
und die Datei über die Verknüpfung mit Administrator ausführe, dann blitzt das CMD-Fenster kurz auf und das war's. Wenn ich das Gleiche allerdings mit normalen Benutzerrechten ausführe, dann geht’s und mir wird das übergebene Argument mit echo %1 begleitend mit einer Pause angezeigt.
Vielleicht schildere ich einfach das Vorhaben konkret:
Ich beabsichtige in die Aufgabenplanung vordefinierte XML-Schemas für alle Benutzer zu importieren und am besten unter dem Benutzer SYSTEM.
:Ale XML-Aufgaben-Schemas, die sich hier in diesem Verzeichnis befinden, importieren

@echo off
setlocal enabledelayedexpansion
@prompt -$G
chcp 1252 >nul
:PushD %~dp0
echo.

:Argument anzeigen, falls vorhanden: repräsentiert das Arbeitsverzeichnis, das bei erhöhten Rechten benutzt werden soll
set Argument=%~1
if defined Argument echo %Argument%
pause

set "UserName=BLA"  
set "Password=BLA-BLA"  
	

set Überschrift=Folgende Aufgaben werden in die Aufgabenplanung importiert:

for /f "tokens=*" %%i in ('dir /b *xml') do (  
	set XML-File=%%i
	set FileName=%%~ni
	if defined XML-File (if defined Überschrift echo %Überschrift%) & set Überschrift=
	echo.
	echo "!XML-File!"  
	schtasks /Create /S %ComputerName% /RU "%UserName%" /RP "%Password %" /XML "!XML-File!" /TN "!FileName!" /F  
)
pause >nul

1. Finde ich es sehr schlecht, das ich erzwungen werde mein Passwort im Klartext einzugeben und
2. das Hinzufügen unter dem SYSTEM-Benutzer mit meinem bzw. mit Administrator-Passwort scheitert. Es meldet mir jeweils, dass das Passwort falsch sei. So ein Benutzer hat ja in diesem Sinne kein Konto auf dem PC und kein Passwort!? Ich habe die volle Administrator-Rechte. Was mache ich hier falsch?
Als Notlösung importiere ich die Aufgaben-Schemas unter meinem normalen Benutzernamen (unter welchem ich angemeldet bin) und gebe das Passwort leider im Klartext ein. Dann gehe ich in die Aufgabenplanung und korrigiere in allen importierten Schemas den gesetzten Benutzer auf SYSTEM-Benutzer.
So wie ihr es sieht, ist es weiterhin eine schlechte Lösung, da nach dem Importieren aller Aufgaben diese manuell nachgearbeitet werden müssen. Dennoch ist es eine große Erleichterung, als alle diese vollständig von Hand einzutippen - kein Zweifel.

Gruß
Evinben
bastla
bastla 31.03.2012 um 10:06:17 Uhr
Goto Top
Hallo evinben!

Versuch es mal zum Thema "Parameter übergeben" so:
Erstelle den Batch in einem Pfad ohne Leerzeichen (im Beispiel "D:\Batch\DeinBatch.cmd") und verwende in der Verknüpfung als Ziel
 cmd /c D:\Batch\DeinBatch.cmd "D:\Ordner in dem der Batch laufen soll"
- der Parameter sollte wie gewohnt als %1 auch bei Ausführung als Administrator ankommen ...

Wenn Du mehrere Parameter verwendest, sollte jeder davon (auch wenn keine Leerzeichen enthalten sind) unter Anführungszeichen gesetzt werden - und falls Du Wert darauf legst, dass auch beim letzten die Anführungszeichen geschlossen werden , musst Du am Ende doppelte Anführungszeichen verwenden (nötig ist das aber nicht, da zB %~4 jedenfalls den Parameter ohne Anführungszeichen liefert) -also etwa:
 cmd /c D:\Batch\DeinBatch.cmd "D:\Ordner in dem der Batch laufen soll" "Parameter 2" "Parameter3" "und noch ein vierter""
Grüße
bastla
evinben
evinben 31.03.2012 um 12:41:04 Uhr
Goto Top
Hallo bastla,

danke dir.
Warum diese Leerzeichen soooo.. problematisch sein sollen bleibt uns wohl ein Rätsel.
Eine Verzeichnis-Struktur sollte möglichst verständlich und Lesefreundlich aufgebaut sein. Ich möchte in dem 21. Jahrhundert so einen Schreibstil nicht unterstützen. Letztendlich sind wir alle Menschen und es sollte uns allen möglichst verständlich sein und insbesondere dann, wenn die Komplexität kontinuierlich ansteigt.
Das Problem habe ich mit Hilfe eurer Anregungen temporär folgendermaßen gelöst:

call "D:\Eigene Einstellungen\Netzwerkeinstellungen\Aufgabenplanung\Ale XML-Aufgabe-Schemas, die sich hier in diesem Verzeichnis befinden, importieren_Schablone.bat.lnk" "%~dp0"  

Wie ihr sieht, das aktuelle Verzeichnis wird als Argument übergeben und in dem aufrufenden Batch als Arbeitsverzeichnis gesetzt. Sollte sich die Verzeichnisstruktur mit der Zeit ändern, funktioniert der Aufruf weiterhin - dankbar dem Windows-Mechanismus die Verknüpfung automatisch zu aktualisieren.
Es ist leicht möglich den CALL-Batch mit der obigen Zeile in dem Explorer-Kontextmenü (z. B. in SendTo oder gleich dann als ein neuer Eintrag für den Dateityp .lnk etwa wie „Verknüpfung als Administrator starten“ mit den Schlüsseln [runas] [command]) einzubauen.
Schauen wir mal was die Praxiserfahrung so zeigen würde. Vielleicht baue ich den Kontextmenü-Eintrag auf allen Rechner ein, falls keine Kollisionen vorprogrammiert wären.

Gruß
evinben
pieh-ejdsch
pieh-ejdsch 16.04.2012 um 00:09:53 Uhr
Goto Top
moin evinben,

wenn Dein CMD Fenster nur kurz aufblitzt lässt sich im Ziel der Verknüpfung CMD.exe /K nutzen:
C:\Windows\System32\cmd.exe /k call "D:\Eigene Einstellungen.cmd"  
somit solltest Du Die Fehler ehern sehen können.

als Schmankerl kannste immernoch im Ziel der Verknüpfung mit pushD Verzeichnis vor der Batchausführung hinein springen:
C:\Windows\System32\cmd.exe /k pushd "D:\" && "Eigene Einstellungen.cmd"  

genau so verwende ichs auch in der Aufgabenplanung - ebend wegen dieser komischen Sache mit den Anführungszeichen.

Gruß Phil