none
Invoke-command mit IF Abfrage RRS feed

  • Frage

  • Hallo,

    ich bin dabei ein Scipt zu schreiben welches mir Office 2010 installiert.

    Nun würde ich gerne eine Abfrage einbauen...wenn Programm Word,Excel,Powerpoint oder Outlook läuft, dann verlassen die Remotesitzung...wenn nicht geh weiter...und dabei hängt es nun leider bei mir!Ich hoffe ihr könnt mir helfen

    Der Code der eingebaut werden muss (funtioniert,hab ich getestet!

    Invoke-Command -Session (Get-PSSession) -ScriptBlock{$Officeprozess=Get-Process|Where-Object {$_.processname -like "*word*" -or $_.processname -like "*excel*" -or $_.processname -like "*outlook*" -or $_.processname -like "*powerpnt*"}}


    if ($Officeprozess -eq $null)
    {
       "Führe die anderen Invoke Befehle aus"
    }
    else
    {
        "Remove-PSSession (Get-PSSession)"
    }

    Mein Script:

    #Computer einlesen
    $Collection= "PC1","PC2"
    
    #Kontakt aufbauen
    foreach ($item in $collection){
    
     
    
    New-PSSession $item
    
    
    
    #Roaming kopieren
    Invoke-Command -Session (Get-PSSession) -ScriptBlock{ $UserprofileaufClient=Get-ChildItem -Path $env:SystemDrive\Users}
    Invoke-Command -Session (Get-PSSession) -ScriptBlock{ New-Item -Path "C:\Temp\Officebackup" -ItemType directory}
    Invoke-Command -Session (Get-PSSession) -ScriptBlock{ foreach ($item in $UserprofileaufClient){ Copy-Item "C:\Users\$Item\AppData\Roaming\Microsoft\Office" -recurse -Destination "C:\Temp\Officebackup\$Item\" }} #Sichert die ACL
    Invoke-Command -Session (Get-PSSession) -ScriptBlock{ foreach ($item in $UserprofileaufClient){ Copy-Item "C:\Users\$Item\AppData\Roaming\Microsoft\Templates" -Recurse -Destination "C:\Temp\Officebackup\$Item\" -ErrorAction SilentlyContinue}} # für Office > 2003 ->Sichert die normal.dot im Order Templates und erstellt diese im Backup
    Invoke-Command -Session (Get-PSSession) -ScriptBlock{ foreach ($item in $UserprofileaufClient){ Copy-Item "C:\Users\$Item\AppData\Roaming\Microsoft\Vorlagen" -Recurse -Destination "C:\Temp\Officebackup\$Item\" -ErrorAction SilentlyContinue}} # für Office 2003 ->Sichert die normal.dot im Order Templates und erstellt diese im Backup
                                                        
    #Mitteilung an User, dass Office installiert wird!
    Invoke-Command -Session (Get-PSSession) -ScriptBlock{msg * /w "Eine Anwendung wird installiert, Sie werden benachrichtig wenn die Installation abgeschlossen ist! IT-Abteilung"}                                         
        
    
    #Office deinstallieren /installieren
    Invoke-Command -Session (Get-PSSession) -ScriptBlock{& cmd /c msiexec "\\bbg-mdt-01\Office$\Office2010\SETUP.EXE"}
    copy-item C:\tool\SysinternalsSuite\PsExec.exe \\$item\c$\temp
    
    Invoke-Command -Session (Get-PSSession) -ScriptBlock{& cmd /c C:\temp\PsExec.exe \\$env:COMPUTERNAME /accepteula  -s \\bbg-mdt-01\Office$\Office2010\Standard\setup.exe}
    
    
    #Normal.dot g zurück kopieren aber Kopie am Ort belassen als Backup
    Invoke-Command -Session (Get-PSSession) -ScriptBlock{ foreach ($item in $UserprofileaufClient){New-Item -Path "C:\Users\$Item\AppData\Roaming\Microsoft\Templates\" -ItemType directory}}
    Invoke-Command -Session (Get-PSSession) -ScriptBlock{ foreach ($item in $UserprofileaufClient){ Copy-Item "C:\Temp\Officebackup\$Item\Templates\*" -Destination "C:\Users\$Item\AppData\Roaming\Microsoft\Templates\" -ErrorAction SilentlyContinue}} #2007 und größer
    Invoke-Command -Session (Get-PSSession) -ScriptBlock{ foreach ($item in $UserprofileaufClient){ Copy-Item "C:\Temp\Officebackup\$Item\Vorlagen\*" -Destination "C:\Users\$Item\AppData\Roaming\Microsoft\Templates\" -ErrorAction SilentlyContinue}} #2003
    
    #Mitteilung an User, dass Office installiert wurde!
    Invoke-Command -Session (Get-PSSession) -ScriptBlock{msg *  "Die Installation ist abgeschlossen!Vielen Dank für Ihre Geduld! IT-Abteilung."}                                         
        
    Add-Content -Value $item -Path "e:\Office2010Std_delpoyment.log"
    
    #Exit-PSSession 
    Remove-PSSession (Get-PSSession)
    }
    
    
    


    Gruß Toni! Wenn Dir meine Antwort hilft, markiere sie bitte als Antwort! Vielen Dank!


    • Bearbeitet tonibert Sonntag, 22. November 2015 12:18
    Sonntag, 22. November 2015 12:15

Antworten

  • Hallo Toni,

    vorab - du hast schon einiges zusammengebaut und bist ja quasi kurz vorm Ziel.

    Trotzdem würde ich dir anraten die Umsetzung nochmal zu überdenken.

    Du nutzt für jeden Aufruf ein Invoke-Command auf die PSSession - schöner wäre es gewesen, wenn du den ganzen Code in eine ps1-Datei packst und dann sowas wie

    invoke-command -computer $MachineName -filepath "C:\Skript.ps1"
    

    machen würdest, um den Code nicht so aufzublasen.  Weiter ist die Benutzung von psexec, um dadurch die Deinstallation auf dem Zielrechner mit Admin-Rechten durchzuführen schon arg gefuscht.

    Die Benutzung von msg - kann man machen - würde man aber eigentlich auch sauberer machen mit einer Windows Forms Messagebox oder so.

    Habt ihr vielleicht einen SCCM im Einsatz? Dann würde ich ein Skript bauen und via dem verteilen lassen.

    Als Alternative würde ich dir raten ein PS-Skript zu bauen, dass in sich autark ablaufen kann. Das kannst du z.B. auf deinem Rechner aufbauen und auch live debuggen. Dann machst du sowas wie:

    $cred = get-credential #Eingabe eines Users mit höheren Rechten
    
    Invoke-Command -ComputerName $Computer -filepath "C:\Skript.ps1" -credential $cred

    Die Credentials kannst du dann auch in eine Datei speichern - in etwa so:

    Read-host -assecurestring | convertfrom-securestring | out-file C:\cred.txt
    $password = get-content C:\cred.txt | convertto-securestring
    $credential = new-object -typename System.Management.Automation.PSCredential -argumentlist "myusername",$pass



    Best regards,

    David das Neves

    Technology Specialist - Consulting Services
    Computacenter AG & Co. oHG - Munich

    Blog    
    Creating Powershell GUIs with XAML? Take a look! PSGUI

    Sonntag, 22. November 2015 12:42

Alle Antworten

  • Hallo Toni,

    vorab - du hast schon einiges zusammengebaut und bist ja quasi kurz vorm Ziel.

    Trotzdem würde ich dir anraten die Umsetzung nochmal zu überdenken.

    Du nutzt für jeden Aufruf ein Invoke-Command auf die PSSession - schöner wäre es gewesen, wenn du den ganzen Code in eine ps1-Datei packst und dann sowas wie

    invoke-command -computer $MachineName -filepath "C:\Skript.ps1"
    

    machen würdest, um den Code nicht so aufzublasen.  Weiter ist die Benutzung von psexec, um dadurch die Deinstallation auf dem Zielrechner mit Admin-Rechten durchzuführen schon arg gefuscht.

    Die Benutzung von msg - kann man machen - würde man aber eigentlich auch sauberer machen mit einer Windows Forms Messagebox oder so.

    Habt ihr vielleicht einen SCCM im Einsatz? Dann würde ich ein Skript bauen und via dem verteilen lassen.

    Als Alternative würde ich dir raten ein PS-Skript zu bauen, dass in sich autark ablaufen kann. Das kannst du z.B. auf deinem Rechner aufbauen und auch live debuggen. Dann machst du sowas wie:

    $cred = get-credential #Eingabe eines Users mit höheren Rechten
    
    Invoke-Command -ComputerName $Computer -filepath "C:\Skript.ps1" -credential $cred

    Die Credentials kannst du dann auch in eine Datei speichern - in etwa so:

    Read-host -assecurestring | convertfrom-securestring | out-file C:\cred.txt
    $password = get-content C:\cred.txt | convertto-securestring
    $credential = new-object -typename System.Management.Automation.PSCredential -argumentlist "myusername",$pass



    Best regards,

    David das Neves

    Technology Specialist - Consulting Services
    Computacenter AG & Co. oHG - Munich

    Blog    
    Creating Powershell GUIs with XAML? Take a look! PSGUI

    Sonntag, 22. November 2015 12:42
  • Hallo David,

    vielen Dank für deine Antwort!Mit dem Parameter -filepath funktioniert es und ich kann meine IF-Abfrage durchführen!

    SUPER und nochmal Danke!

    ->

    "Du nutzt für jeden Aufruf ein Invoke-Command auf die PSSession - schöner wäre es gewesen, wenn du den ganzen Code in eine ps1-Datei packst und dann sowas wie

    invoke-command -computer $MachineName -filepath "C:\Skript.ps1"

    machen würdest, um den Code nicht so aufzublasen."

    Habe ich so umgesetzt, danke für den Hinweis!Es funktioniert sehr gut!

    ->

    "Weiter ist die Benutzung von psexec, um dadurch die Deinstallation auf dem Zielrechner mit Admin-Rechten durchzuführen schon arg gefuscht"

    Ich habe verschieden Wege probiert aber leider nichts für mich laufendes gefunden!Wenn du hier einen Hinweis für mich hast nehme ich den gerne an!Wobei das ja Tools von MS sind, daher ist es in meinen Augen nicht ganz so "gefuscht" - :-)

    ->

    "Die Benutzung von msg - kann man machen - würde man aber eigentlich auch sauberer machen mit einer Windows Forms Messagebox oder so"

    Habe ich bisher leider nicht nicht gemacht, wenn du da etwas präziser wirst, probier ich es gerne!

    ->

    "Habt ihr vielleicht einen SCCM im Einsatz? Dann würde ich ein Skript bauen und via dem verteilen lassen."

    Leider nicht, daher habe ich mich für den PS weg entschieden!

    ->

    "Als Alternative würde ich dir raten ein PS-Skript zu bauen, dass in sich autark ablaufen kann. Das kannst du z.B. auf deinem Rechner aufbauen und auch live debuggen."

    Ich habe es genau anders herum gemacht!Erst auf meinem Client probiert und es dann jeweils in -Scriptblock {} gelegt!

    Im Moment bin ich noch am testen, wie ich, nach erfolgreicher Installation, die Daten in ein Log schreibe!

    Dass ich da add-content nehme ist mir klar, nur wollte ich es in meinem "aufgerufenen" Script am Ende auf einen Netzwerkpfad schreiben, aber das funktioniert leider im Moment noch nicht!

    Hast du da vielleicht einen Denkanstoss für mich?!

    Ich arbeite seit ca. 1 Jahr voller Begeisterung mit Powershell und lerne halt ständig durch testen und üben an praktischen Themen!Auch das war ein Grund, dass ich mich für die Installation mit PS entschieden habe. Ich erarbeite mir die Sachen eben nach Feierabend privat.Deshalb nochmals vielen Dank für deine bishergen Hinweise!

    @Denniver: Es tut mir Leid, ich habe es nicht früher geschafft!


    Gruß Toni! Wenn Dir meine Antwort hilft, markiere sie bitte als Antwort! Vielen Dank!



    • Bearbeitet tonibert Montag, 23. November 2015 18:49
    Montag, 23. November 2015 18:44
  • > @Denniver: Es tut mir Leid, ich habe es nicht früher geschafft!

    Alles gut, kein Grund sich zu entschuldigen. :-)
     


    Blog: http://bytecookie.wordpress.com

    Kostenloser Powershell Snippet Manager v4: Link ! Neue Version !
    (Schneller, besser + komfortabler scripten.)

    Hilf mit und markiere hilfreiche Beiträge mit dem "Abstimmen"-Button (links) und Beiträge die eine Frage von dir beantwortet haben, als "Antwort" (unten).
    Warum das Ganze? Hier gibts die Antwort.

    Montag, 23. November 2015 22:18
    Moderator
  • Hi Toni,

    ah sehr schön - freut mich zu lesen, dass ich helfen konnte.

    Das mit psexec ist zwar von "Microsoft" vom Mark zur Verfügung gestellt, sollte man aber eigentlich produktiv meiden, wenn es irgendwie möglich ist. Hintergrund: Wenn du es nutzen kannst, kann es auch jeder andere Mitarbeiter mit Admin-Rechten nutzen und könnte damit sich Systemrechte auf anderen Rechnern "erfuschen" und Unsinn treiben. Sonst kannst du es von der technischen Seite aus natürlich benutzen. Ohne SCCM ist es wohl vertretbar.

    Messagebox: schau mal hier

    Wegen Logging schau dir das mal an hier

    ___________________________________

    Ich arbeite seit ca. 1 Jahr voller Begeisterung mit Powershell und lerne halt ständig durch testen und üben an praktischen Themen!Auch das war ein Grund, dass ich mich für die Installation mit PS entschieden habe. Ich erarbeite mir die Sachen eben nach Feierabend privat.Deshalb nochmals vielen Dank für deine bishergen Hinweise!

    _______________________________________________

    Sehr gerne! Schau dir mal auf der MVA Microsoft Virtual Academy alles im Powershell an.

    MVA-Links zum Einarbeiten: (by Jeffrey Snover und Jason Helmick)

    Jump Start - MVA

    Tools und Skripterstellung - MVA

    DSC- MVA

    Bücher:

    Umfassendes Einführungs-Buch

    Aktuellstes Buch für DSC

    Grüße

     


    Best regards,

    David das Neves

    Technology Specialist - Consulting Services
    Computacenter AG & Co. oHG - Munich

    Blog    
    Creating Powershell GUIs with XAML? Take a look! PSGUI

    Dienstag, 24. November 2015 11:50
  • Hallo David,

    die ersten beiden Jumpstarts habe ich mir schon reingezogen :-)Aber Danke!

    Den letzen Link kannte ich noch nicht!

    Ein Buch habe ich mir auch schon reingepfiffen!Aber das war hier nicht dabei!Ich danke dir, den Rest werde ich mal durcharbeiten!

    ->

    "Wenn du es nutzen kannst, kann es auch jeder andere Mitarbeiter mit Admin-Rechten nutzen und könnte damit sich Systemrechte auf anderen Rechnern "erfuschen" und Unsinn treiben"

    Davon haben wir nur IT-Admins aber ich habe dich verstanden!


    Gruß Toni! Wenn Dir meine Antwort hilft, markiere sie bitte als Antwort! Vielen Dank!


    • Bearbeitet tonibert Dienstag, 24. November 2015 13:12
    Dienstag, 24. November 2015 13:11