none
ArgumentList und Befehle RRS feed

  • Frage

  • Moin allerseits,

    ich bin dann mal der Neue :D 

    ich muss jetzt doch mal eine Frage stellen, weil ich einfach nichts finde zu meinem Thema.

    Vorweg, ich bin kein Anwendungsentwickler sondern Systemintegrator und möchte mich da jetzt einlesen und weiterentwickeln. Mein Chef sagte gleich ich soll etwas zusammenstellen.

    Mein Problem:

    Ich habe ein Script auf einem Netzlaufwerk liegen, welches über eine Richtlinie einmal in der Woche ausgeführt werden soll. Dies soll alles im Hintergrund laufen, den WindowStyle Hidden setze ich noch ein, da ich jetzt erstmal verfolgen will, was passiert.

    Hier einmal das Script:

    #Creds erstellen und Verschlüsselung nutzen
    
        $User = “mein\Domainuser(Admin)”
        $EncryptedPassword = Get-Content -Path "entsprechender\Pfad"
        $Key = Get-Content -Path "entsprechender\Pfad"
        $SecurePassword = ConvertTo-SecureString -String $EncryptedPassword -Key $Key
        $Cred = New-Object System.Management.Automation.PSCredential $User, $SecurePassword
    
    # Argumente erstellen
    
        $Pfad = Set-Location 'C:\Program Files (x86)\Dell\CommandUpdate'
        $Befehl = '.\dcu-cli.exe /scan'
        $Profile = ' &{Start C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -Verb RunAs}'
        
    # Powershell als admin ausführen und Argument übergeben
    
        Start-Process powershell.exe $Profile -Credential $Cred  -ArgumentList  $Befehl

    Fehlermeldung: 

    Start-Process : Es wurde kein Positionsparameter gefunden, der das Argument " &{Start C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -Verb RunAs}" akzeptiert.
    In Mein\Pfad\CommandUpdate.ps1:20 Zeichen:5
    +     Start-Process powershell.exe $Profile -Credential $Cred  -Argumen ...
    +     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : InvalidArgument: (:) [Start-Process], ParameterBindingException
        + FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.PowerShell.Commands.StartProcessCommand

    - Wenn ich die ArgumentList auskommentiere, wird mir die PS als Admin geöffnet ohne Probleme. 

    - Wenn ich das Profil auskommentiere und ArgumentList nutze, dann führt die PS den Befehl aus und es läuft super (zumindest auf meinem Rechner)

    - Auf einem anderen Rechner (selbes System) kommt die UAC Abfrage, welche aber nicht erscheinen soll. 

    Ich habe das Gefühl, dass meine PS in diesem Moment einfach nicht als Admin gestartet wird, weil das -Verb RunAs fehlt.

    Über die Gruppenrichtlinie wird alles als entsprechender Nutzer mit erhöhten Rechten ausgeführt

    Wie kann ich jetzt meine PS als Admin öffnen lassen, aber auch gleich mit dem Befehl, das mein Scan ausgeführt wird?

    Hoffe jemand kann mir einen Denkanstoß geben.

    Beste Grüße

    Cewox


    • Bearbeitet Cewox Mittwoch, 2. September 2020 09:45
    Mittwoch, 2. September 2020 09:30

Antworten

  • Ok das versteh ich jetzt, könnte ich denn eine Schleife bauen, dass alles in einer Variable gespeichert wird die ich dann in ArgumentList angebe?


    Du kannst alles beliebig komplex gestallten, wenn Du unbedingt möchtest. Ich würde aber empfehlen, es so einfach wie möglich zu halten. Das macht die Ausführung robuster und leichter zu debuggen und zu warten und zu erweitern falls nötig/erwünscht.

    Wenn ich Dich richtig verstehe, willst Du das Ganze automatisiert als scheduled Task laufen lassen, richtig? Dann würde ich schon mal den Quatsch mit dem Übergeben der Credentials weglassen und den scheduled Task einfach mit dem entsprechenden Account laufen lassen. Dort wird dann Powershell.exe als zu startendes Programm konfiguriert und bei Argumente übergibst Du z.B. "-EP bypass -File <kompletter Pfad zum Script>" und im Script steht dann nur das hier:

    Start-Process -FilePath 'C:\Program Files (x86)\Dell\CommandUpdate\dcu-cli.exe' -ArgumentList '/scan'
    Ich gehe mal davon aus, dass das sowieso nur ein Beispiel sein sollte. Für die eine Kommandozeile brauchst Du ja kein Script. Das könntest Du auch direkt als Aktion im scheduled Task starten. ;-)


    Live long and prosper!

    (79,108,97,102|%{[char]$_})-join''

    Donnerstag, 3. September 2020 23:07
  • Moin,

    die Antwort ist hier, wie so oft, RTFM ;-)

    Das Cmdlet Start-Process hat zwei positionale Parameter: -FilePath auf Position 0 (in Deinem Fall "powershell.exe") und ArgumentList auf Position 1 (in Deinem Fall $Profile). Somit ist ArgumentList bereits verbraucht und kann nicht nochmal angegeben werden,

    Es ist beim Skripten echt hilfreich, alle Argumente explizit anzugeben und sich nicht auf Positionen zu verlassen...


    Evgenij Smirnov

    http://evgenij.smirnov.de


    Mittwoch, 2. September 2020 10:14

Alle Antworten

  • Rufe das Script doch direkt auf, Stichwort Direktaufruf oder DOT-Sourcing:

    https://www.msxfaq.de/code/powershell/psmodular.htm111

    Mittwoch, 2. September 2020 10:09
  • Moin,

    die Antwort ist hier, wie so oft, RTFM ;-)

    Das Cmdlet Start-Process hat zwei positionale Parameter: -FilePath auf Position 0 (in Deinem Fall "powershell.exe") und ArgumentList auf Position 1 (in Deinem Fall $Profile). Somit ist ArgumentList bereits verbraucht und kann nicht nochmal angegeben werden,

    Es ist beim Skripten echt hilfreich, alle Argumente explizit anzugeben und sich nicht auf Positionen zu verlassen...


    Evgenij Smirnov

    http://evgenij.smirnov.de


    Mittwoch, 2. September 2020 10:14
  • Ok das versteh ich jetzt, könnte ich denn eine Schleife bauen, dass alles in einer Variable gespeichert wird die ich dann in ArgumentList angebe?


    • Bearbeitet Cewox Mittwoch, 2. September 2020 11:50
    Mittwoch, 2. September 2020 11:50
  • Ok das versteh ich jetzt, könnte ich denn eine Schleife bauen, dass alles in einer Variable gespeichert wird die ich dann in ArgumentList angebe?


    Du kannst alles beliebig komplex gestallten, wenn Du unbedingt möchtest. Ich würde aber empfehlen, es so einfach wie möglich zu halten. Das macht die Ausführung robuster und leichter zu debuggen und zu warten und zu erweitern falls nötig/erwünscht.

    Wenn ich Dich richtig verstehe, willst Du das Ganze automatisiert als scheduled Task laufen lassen, richtig? Dann würde ich schon mal den Quatsch mit dem Übergeben der Credentials weglassen und den scheduled Task einfach mit dem entsprechenden Account laufen lassen. Dort wird dann Powershell.exe als zu startendes Programm konfiguriert und bei Argumente übergibst Du z.B. "-EP bypass -File <kompletter Pfad zum Script>" und im Script steht dann nur das hier:

    Start-Process -FilePath 'C:\Program Files (x86)\Dell\CommandUpdate\dcu-cli.exe' -ArgumentList '/scan'
    Ich gehe mal davon aus, dass das sowieso nur ein Beispiel sein sollte. Für die eine Kommandozeile brauchst Du ja kein Script. Das könntest Du auch direkt als Aktion im scheduled Task starten. ;-)


    Live long and prosper!

    (79,108,97,102|%{[char]$_})-join''

    Donnerstag, 3. September 2020 23:07
  • Für die eine Kommandozeile brauchst Du ja kein Script. 

    Und auch keine PowerShell als Wrapper ;-)

    Evgenij Smirnov

    http://evgenij.smirnov.de

    Freitag, 4. September 2020 05:21