[Gelöst] Powershell Skript lässt sich nicht ausführen

  • Hallo zusammen,


    ich möchte über Autoit ein Powershell Skript ausführen und bin mittlerweile am Verzweifeln.


    Ich habe es wie folgt versucht:




    ShellExecute("powershell.exe –noexit", "autoitps1.ps1") ;>>> Das funktioniert glaube ich ohnehin nicht :P
    RunWait("powershell.exe –noexit " & @ScriptDir & "\autoitps1.ps1")
    RunAs(User, Domain, Password, "", "powershell.exe –noexit " & @ScriptDir & "\autoitps1.ps1")


    Leider bin ich wohl zu dumm dafür. Denn jedes mal kommt die selbe Fehlermeldung im PS-Fenster:

    Code
    Die Datei "C:\Users\xyz\Desktop\autoitps1.ps1" kann nicht geladen werden, d
    a die Ausführung von Skripts auf diesem System deaktiviert ist. Weitere Informa
    tionen erhalten Sie mit "get-help about_signing".
    Bei Zeile:1 Zeichen:39
    + C:\Users\xyz\Desktop\autoitps1.ps1 <<<<
    + CategoryInfo : NotSpecified: (:) [], PSSecurityException
    + FullyQualifiedErrorId : RuntimeException


    im Skript ansich steht folgendes:

    Code
    New-Mailbox -UserPrincipalName testxy@domain.de -Alias testxy -Database "Database1" -Name Test XY -OrganizationalUnit Users -FirstName Test -LastName XY -DisplayName "Test XY"

    Ich hoffe, mir kann geholfen werden, ich stehe gerade "etwas" vor der Wand ?(


    LG,
    der Robert

  • Hallo,


    die Antwort steht doch da!

    Code
    Die Datei "C:\Users\xyz\Desktop\autoitps1.ps1" kann nicht geladen werden, d
    a die Ausführung von Skripts auf diesem System deaktiviert ist. Weitere Informa
    tionen erhalten Sie mit "get-help about_signing".

    Man muss erstmal die Ausführung von Powershell-Scripten erlauben, Standard ist das nur signierte Scripte ausgeführt werden dürfen. Mit Set-ExecutionPolicy RemoteSigned -Force dürfen alle lokale Scirpte ausgeführt werden signiert oder unsigniert. Von einer Netzfreigabe müssen sie immer noch signiert sein. Wenn du in Powershell mal get-help about_signing bekommst du alle nötigen Infos dazu.


    Damit du auch gleich siehst wie es mit ShellExecute funktioniert!
    ShellExecute("powershell.exe", "-command ""&{if ((Get-ExecutionPolicy) -notmatch 'RemoteSigned') {Set-ExecutionPolicy RemoteSigned -Force} }""")


    Dein Aufruf muss also so lauten:
    ShellExecute("powershell.exe", "-File autoitps1.ps1")

  • Hallo Bernd und Danke für deine Antwort,


    leider funktioniert es jetzt noch weniger. das Powershell Fenster schließt sich sofort, und es wird kein Postfach angelegt.


    werden hierfür noch weitere inkludes in autoit benötigt?

  • Nein für Shellexecute benötigst du in dieser Form keine weiteren Includes. Läuft dein Powershell-script denn wenn du es direkt in einer PS-Umgebung ausführst?

  • Das ist die Fehlermeldung.

    Code
    Die Benennung "New-Mailbox" wurde nicht als Name eines Cmdlet, einer Funktion, einer Skriptdatei oder eines ausführbaren Programms erkannt. Überprüfen Sie die Schreibweise des Namens, oder ob der Pfad korrekt ist (sofern enthalten), und wiederholen Sie den Vorgang.
  • Das heisst das New-Mailbox unbekannt ist. Entweder musst du in Powershell noch ein Modul importieren und/oder auf einem Exchange-Server ausführen.

  • Auf einem Exchange ausführen ist keine Möglichkeit, da das Programm später über eine VM genutzt werden soll, um User zu verwalten.


    Ich habe folgenden Befehl probiert, und leider half dies auch nichts. Und zu New-Mailbox finde ich nichts brauchbares im Internet. Überall steht nur "Importiere das", aber nirgends, wie genau das gehen soll. Vor allem für New-Mailbox..


    Code
    Get-Module -ListAvailable | Import-Module

    Nachtrag: Ich werde die hier beschriebene Vorgehensweise mal probieren und mich wieder melden: http://exchangeserverpro.com/e…install-management-tools/

  • Hab das Thema mal verschoben, wird jetzt doch zu Powershell/Exchange lastig!


    Ich habe keinen Exchange am laufen aber wenn du die Exchange-Management-Tools installierst sind evtl. auch die Module für Powershell enthalten. Müssen dann evtl. nur noch über "Windows-Funktionen aktivieren oder deaktivieren" hinzugefügt werden.

  • Hallo Bernd, und danke nochmals für deine geduld :P


    ich habe die tools installiert, und dennoch will es nicht so recht laufen. Hast du sonst noch eine Idee?


    P.S.: Danke fürs Verschieben und sorry für das falsche Forum :P

  • Okay, immerhin kann ich es mittlerweile ausführen..


    Jetzt wird es wieder Autoit-lastig :D


    Und zwar wird das vorher gefragte Kennwort zum Starten benötigt, damit das Programm als verifizierter User die Postfächer anlegen kann. Soweit, sogut.


    So wird die Powershell geöffnet:
    RunAs($sUser, $sDomain, $sPassword, 2, @ScriptDir & "\pwrshell.exe")


    jetzt will ich in der pwrshell.exe (welche ein kompiliertes Autoit-Skript ist) gerne die Daten aus den Formularen des skriptes, welche die exe gestartet hat, übernehmen.


    Konkret: $sDomain, $sUserLogin, $sPassword, $sUser


    Anschließend soll Powershell mit


    RunAs($sUser, $sDomain, $sPassword, 2, $1 & $2 & $3 & $4)


    gestartet werden. Allerdings kann er mit $sUser, $sDomain und $sPasswort nichts anfangen, diese sind leer.. (sie sind in dem Hauptprogramm als Global deklariert, was aber nichts hilft, weil ein include der main.au3 zur Folge hätte, dass die funktionen am anfang nochmals ausgeführt werden.) Ist es irgendwie möglich, mit den Variablen im anderen Skript weiterzuarbeiten? mit $cmdLine[] funktionierte es nicht...


    Ich hoffe nochmals auf Hilfe und sende LG,
    der Robert

  • Hallo,


    wenn du dein Programm mit RunAs($sUser, $sDomain, $sPassword, 2, @ScriptDir & "\pwrshell.exe") startest, dann läuft doch das Programm schon mit den benötigten Recht Dann sollte normal ein einfaches Run("Powershell.exe" ...) reichen.

  • Das Problem ist, dass ich in der Shell selbst nochmal andere Daten brauche (Firma, Vorname, Nachname usw.), die ich aber auch überssichtsgründen weggelassen habe. Diese Daten sende ich dann per ControlSend() in die Shell, aber die Daten brauche ich halt aus dem Main-Skript, weil dort die Eingaben erfolgen.

  • Dann kannst du z. B. diese folgendermaßen als Parameter übergeben RunAs($sUser, $sDomain, $sPassword, 2, @ScriptDir & "\pwrshell.exe -Firma:""NixAG"" -Name:""Huber"" -Vorname:""Klaus""")


    In dem Programm Pwrshell.exe müssen diese Parameter dann ausgewertet werden, dass kann man z. B. so machen

    AutoIt: pwrshell.au3
    If $cmdline[0] > 0 Then
    For $i = 0 To $cmdline[0]
    If StringRegExp($cmdline[$i], "(?i)^\-Firma\:.*?$") Then $szFirma = StringRegExp($cmdline[$i], "(?i)^\-Firma\:(.*?)$", 1)[0]
    If StringRegExp($cmdline[$i], "(?i)^\-Name\:.*?$") Then $szName = StringRegExp($cmdline[$i], "(?i)^\-Name\:(.*?)$", 1)[0]
    If StringRegExp($cmdline[$i], "(?i)^\-Vorname\:.*?$") Then $szVorname = StringRegExp($cmdline[$i], "(?i)^\-Vorname\:(.*?)$", 1)[0]
    Next
    EndIf
    MsgBox(0, "", "Firma: " & $szFirma & @CRLF & "Name: " & $szName & @CRLF & "Vorname: " & $szVorname & @CRLF )

    Edit:


    Jetzt nur noch mal zum Verständnis eine Frage. Machst du in dem Programm pwrshell.exe noch etwas anderes als die Powershell aufzurufen. Wenn nicht kann du den Umweg nämlich sparen.

  • Danke dir vielmals, ich werde es gleich morgen früh testen und mich dann nochmal melden :D


    Im Prinzip nicht. Außer, dass ich Probleme hatte, die Powershell über 32 Bit zum Laufen zu bekommen und daher eine zwischengeschaltete 64 Bit Version erstellt habe, die das Starten von Powershell übernimmt.


    Nachtrag: wenn das testen vorbei ist, umgehe ich natürlich den zwischenschritt :P


    okay, es hat so funktioniert. Leider kommt jetzt immer die fehlermeldung, dass das kennwort als secure string zur verfügung stehen muss.


    Ich sende per Controlsend die Daten an die Powershell, allerdings habe ich noch nicht rausgefunden, wie zum Geier ich das Kennwort mitgeben kann, ohne dass -AsSecureString benötigt wird.


    Ich habe als zwischenschritt versucht, das Skript "step.ps1" zu starten, in dem einfach nur folgendes steht:


    Bash
    $pw = Read-Host "Kennwort" -AsSecureString

    Anschließend wollte ich dann das Kennwort aus dem Skript übernehmen, was allerdings nichts funktioniert, ist ja klar.... wie übergebe ich der Powershell die Daten, die unten im letzten Controlsend mit angegeben sind, um es komplett über das Skript laufen zu lassen? Google lässt mich da stark im Stich :(



    ControlSend("Computer: ","","",@ScriptDir & "\step.ps1" & "{ENTER}")
    ControlSend("Computer: ","","","blah" & "{ENTER}")
    ControlSend("Computer: ","","",'New-Mailbox -UserPrincipalName ' & $sLogin & $sEmail & ' -Database "Mailbox 01" -Alias ' & $sLogin & ' -Name "' & $sNachname & ', ' & $sVorname & '" -Password $pw'); & "{ENTER}")


    Sorry für Dreifachpost, evtl kann das ja gemerged werden :P


    Ich konnte das Problem beheben, indem ich die Datei einfach vor dem Aufruf jedes mal neu schreiben lasse :)


    LG,
    der Robert