2017-02-11 5 views
1

Ich kann mit der rechten Maustaste auf die Datei DEC16.bat klicken und es wird ausgeführt. Ich habe Probleme, es in ein Skript aufzunehmen, das von einem Flash-Laufwerk ausgeführt wird. Das PowerShell-Skript kopiert im Wesentlichen eine Reihe von Installationsdateien auf den Computer eines Clients.Fehler beim Versuch, .bat-Datei mit runas auszuführen Administrator mit PowerShell

Windows PowerShell 
Copyright (C) 2013 Microsoft Corporation. All rights reserved. 

PS H:\> $script = "\\xxxhsfmsl03\adap\Database\Install\AugKA\DEC16.bat" 
PS H:\> 
PS H:\> Start-Process powershell -Credential “xxx\xxxvis_desktop” -ArgumentList '-noprofile -command &{Start-Process $script -verb runas}' 
Start-Process : This command cannot be run due to the error: The directory name is invalid. 
At line:1 char:1 
+ Start-Process powershell -Credential “xxx\xxxvis_desktop” -ArgumentList '-noprof ... 
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : InvalidOperation: (:) [Start-Process], InvalidOperationException 
    + FullyQualifiedErrorId : InvalidOperationException,Microsoft.PowerShell.Commands.StartProcessCommand 

PS H:\> $script 
\\xxxhsfmsl03\adap\Database\Install\AugKA\DEC16.bat 
PS H:\> 

(Ich habe eingefügt "xxx" 's um die Unschuldigen zu schützen)

+1

Argument mit einfachen Anführungszeichen zitiert. Daher wird $ script nicht erweitert. Verwenden Sie doppelte Anführungszeichen – Matt

+1

Wenn Sie diesen Code von [hier] (http://stackoverflow.com/questions/15305696/running-a-bat-file-as-admin-from-powershell) habe ich verstanden. Ich sehe, dass du gestern einen Kommentar hinterlassen hast. Ich habe auch einen auf den Fehler hingewiesen. – Matt

Antwort

0

Versuchen Sie Folgendes:

Start-Process powershell ` 
    -WorkingDirectory (Split-Path $script) ` 
    -Credential xxx\xxxvis_desktop ` 
    -ArgumentList '-noprofile', '-command', " 
    & { start-process powershell -ArgumentList '-File', '$script' -Verb RunAs } 
    " 
  • Ihr Hauptproblem war sehr wahrscheinlich, dass der Zielbenutzer - xxx\xxxvis_desktop - fehlte die Erlaubnis, auf das zuzugreifen, was zufällig das aktuelle Verzeichnis zum Zeitpunkt des Aufrufs war.

    • Einstellen des Arbeitsverzeichnis explizit auf ein Verzeichnis der Zielbenutzer zugreifen darf sollte dieses Problem beheben--WorkingDirectory (Split-Path $script) setzt das Arbeitsverzeichnis. zum dir. in dem sich das Zielskript befindet.
  • Ihr zweites Problem - wie von Matt in einem Kommentar zu der Frage darauf hingewiesen - ist, dass die Befehlsfolge Sie Start-Process gaben in '...' (einzelnen Anführungszeichen) eingeschlossen wurde, so dass die eingebetteten $script variable Referenz nicht zu erweitern (interpoliert).

    • Mit "..." (Doppel Anführungszeichen) behebt dieses Problem; Beachten Sie jedoch, dass die Befehlszeile, die an die ausführbare Datei powershell übergeben wird, in einzelne Argumente unterteilt ist übergeben über -ArgumentList - die (literal, single-quoted) -Optionen, gefolgt von der (interpolierten, doppelt zitierten) Befehlszeichenfolge, die ist der beste Weg Argumente zu übergeben, weil es robuster ist.

    • Hinweis, wie die $string Referenz innerhalb der Befehlsfolge in eingeschlossen ist eingebettet '...' um zu gewährleisten, dass, wenn die aufgerufene powershell Instanz der Befehlsfolge parst, der Wert von $string als einzigen Argument erkannt wird (obwohl dies für den vorliegenden Wert nicht notwendig ist, \\xxxhsfmsl03\adap\Database\Install\AugKA\DEC16.bat).

      • Wenn es eine Chance, dass der Wert von $script' Instanzen eingebettet ist, müssen Sie die folgenden (doppelte ' Instanzen ihnen zu entkommen) verwenden:
        $($script -replace "'", "''")
  • Die endgültige Problem ist, dass Sie Start-Process nicht direkt auf einem Skript verwenden können - wie im äußeren Aufruf, müssen Sie powershell aufrufen und das Skript übergeben Dateiname als Argument.


Zusätzliche Hinweise:

  • Die & { ... } Wrapper um den start-process Aufruf in der Befehlszeichenfolge sollte nicht notwendig sein.

  • Im Allgemeinen können Sie einen einzigenStart-Process Anruf mit -Verb RunAs nutzen den Lauf von $script zu erheben, aber leider -Verb RunAs und -Credential können nicht kombiniert werden, so dass bedeutet:

    • Wenn der aktuelle Benutzer ist ein Administratorkonto, wird die erhöhte Sitzung ausnahmslos als dieser Benutzer ausgeführt - Sie erhalten nur eine Ja/Nein-Eingabeaufforderung, um die Höhe zu bestätigen.
    • Andernfalls werden die Anmeldeinformationen aufgefordert, aber Sie können den Benutzernamen in diesem Dialogfeld nicht vorab ausfüllen.

    • Start-Process -Verb RunAs powershell -ArgumentList '-noprofile', '-File', $script

+1

Es funktioniert. Und Sie haben Recht, ich kann den Benutzernamen nicht vorbesetzen, indem ich "-Credential myUserNameHere" ::: und vielen Dank! – JustJohn

Verwandte Themen