The estimated reading time 6 minutes

ISE als Kommandozentrale der Administration (Evolution of ISE profile) Teil 1

Vorwort: Alle Infos in diesem Artikel beziehen sich auf ISE Powershell und deren Profildatei offizielle Microsoft Beschreibung hierzu

Um schnell für den aktuellen Benutzer eine Profildatei zu erstellen, folgenden Code in der ISE ausführen:

if (!(Test-Path -Path $PROFILE )) 
{ New-Item -Type File -Path $PROFILE -Force }

Link_komplette_Profildatei

Schon länger habe ich immer wieder an meiner Profildatei der Powershell ISE gearbeitet. In letzter Zeit wuchs diese aber immer wieder an und es kamen immer neue Funktionen dazu.

Noch eine Info vorab:

Angefangen habe ich mit ISE Steroids in meinem Profil. Die ISE Erweiterung sollte immer mitgeladen werden. Also sah meine ursprüngliche Profildatei folgendermaßen aus:

Diese kleine Abfrage, prüft ob ISE gestartet wird, falls ja startet Steriods mit. Außerdem wird noch nach Updates für Steriods gesucht.

Siehe hierzu auch folgenden Link: http://wahlnetwork.com/2015/08/03/powershell-integrated-scripting-environment-ise/

Zugegeben ist das nicht sonderlich viel ließ ich aber auf Grund anderer Themen so auf sich beruhen.

Mitte des Jahres habe ich das Thema ISE wieder aufgegriffen und wollte einige Themen (Remotepowershell) automatisieren.

Hierzu habe ich bereits einen Artikel verfasst ISE mit eigenen Funktionen erweitern

Somit habe ich nun meine ISE Profildatei mit einigen Erweiterungen versehen.

1. Backup Menü innerhalb von ISE

#add ise menu backupprofil
$parentbackup = $psise.CurrentPowerShellTab.AddOnsMenu.SubMenus.Add('Backup', $null, $null)
$parentbackup.Submenus.Add(' BackupPSProfile',{ Invoke-Expression "$env:HOMEPATH\Documents\WindowsPowerShell\Backup\profile-backup.ps1"}, $null) | Out-Null

Die Funktion “Add” unterstützt hierbei drei Parameter Add.(‘NameMenü’, ‘Befehl/Aufruf’, ‘Shortcut/Tastenkürzel’) , diese sind in meinem Fall beim ersten Menü ausgeschaltet ($null)

Beim Starten wurde nun das Menü erweitert ( Befehl kann auch einfach so ausgeführt werden, das Menü wird erweitert)

Relativ schnell kamen weitere Funktionen innerhalb des ISE Menüs hinzu. Nun stand ich vor der Herausforderung, wie bekomme ich die einzelnen Stände der Profildatei + verknüpfte Skripte gesichert( die meisten Menschen wollen die Arbeit nicht zweimal machen)

Also wurde auch hierzu eine Funktion in die ISE eingebaut, welche mein Profilordner in mein OneDrive Laufwerk kopiert.

Wie sieht nun das Powershell Skript dahinter aus?

#Pfad für PSProfil 
$updatepath  = 'C:\Users\ak\Documents\WindowsPowerShell'
#Pfad für Backupdateien / -ordner
$backuppath= "C:\OneDrive\powershell-scripting\powershell_profile"
#aktuelles Datum auslesen, formatieren und umwandeln in String
$date=((Get-Date).ToString('yyyy-MM-dd-HH-mm-ss'))
#aktuelles Datum auslesen, formatieren und umwandeln in String (nur Datum)
#neuen Unterordner im Backuppfad erstellen (mit Datum)
New-Item -Path  ($backuppath+"\"+$date) -type directory -Force
#falls Ordner nicht existiert, brich das Script mit einem Fehler ab
if( -not (Test-Path ($backuppath+"\"+$date)) )
{
   Throw (Logwrite "Fehler, Backupordner konnte nicht erstellt werden")
}
#starte backup mit robocopy
else {
    $backuponedrive = "$backuppath"+"\"+"$date"
    robocopy "$updatepath" "$backuponedrive" /mir 
    }

2. Remote Powershell Azure AD

Natürlich folgten weitere Menüpunkte wie z.B. die Remote Powershell Verbindung zu Azure AD

Das Powershell Skript zum Verbinden zu Azure AD (mit Import des AzureAD Modules) :

#connect azure ad 
Import-Module AzureAD -Verbose
Update-Module -Name AzureAD -Verbose
Get-Module -Name AzureAD
$MyCred = Get-Credential
Connect-AzureAD -Credential $MyCred
$user = ($MyCred.UserName).ToString()
#change ISE Editor title 
$host.ui.RawUI.WindowTitle = "Remoteconnection to AzureAD with user: $user"


 

HINWEIS: der Titel ändert sich hier ebenfalls, da es manchmal schwierig ist zu erkennen, welche ISE wohin verbunden ist

3. Beenden von Remote PSSessions

Nachdem alle administrativen Arbeiten erledigt sind (gilt für jegliche RemotePowershell Verbindung) sollte diese auch wieder sauber getrennt werden. Auch hierzu habe ich wieder zwei Menüpunkte erstellt (Remove-PSSession, Exit-RemotePS).

 

Das hinterlegte Powershell Skript ist ebenfalls realtiv simpel gestrickt.

#exit open powershell session
Get-PSSession | Where-Object {$_.State -eq "Opened"} | Remove-PSSession
$host.ui.RawUI.WindowTitle = "Windows Powershell ISE no connection"

Auch nach dem Ausführen wird der Titel wieder geändert, man kann nun schnell erkennen, dass keine Remote Session offen ist.

Was verbirgt sich nun hinter Menüpunkt “Exit-RemotePS”?

Es gibt mehrere Wege Remotepowershelling zu betreiben (hier kurz Beschrieben):

  1. Powershell baut eine Session auf und läd die Module und Cmdlets lokal (auch Variablen werden lokal definiert)
  2. Beim “Implicite Remoting” wird der Powershell Code direkt auf dem entfernten Rechner ausgeführt (kein importieren der Cmdlets notwendig)

Also ist das zweite Menü “Exit RemotePS” für das Beenden der Implicit Remoting Verbindung zuständig. Es wird also nur folgender Code ausgeführt:

$parentrps.Submenus.Add(' Exit-RemotePS',{ Invoke-Expression Exit-PSSession; $host.ui.RawUI.WindowTitle = "Windows Powershell ISE no remote connection" }, $null) | Out-Null

Mit “Invoke-Expression” kann man Powershell Code auf den entfernten Rechner übertragen und dort ausführen (Nachteil, es wird winrs benötigt). Man könnte hier ebenso Invoke-Command verwenden, allerdings müssen dann noch andere Parameter beachtet werden

Siehe hierzu einen guten Link Invoke-Expression VS Invoke-Command

Zum Abschluss noch meine ISE Profildatei:

#startup ISE-Steroids
Set-Location C:\temp
if ($psISE)
{
  Start-Steroids
  #Clear-Host
  Write-Host 'ISE-Steriods started!' -ForegroundColor Green
  #check for updates and install 
  Update-Module -Name isesteroids
}


#add ise menu remote powershell
$parentrps = $psise.CurrentPowerShellTab.AddOnsMenu.SubMenus.Add('RemotePowershell', $null, $null) 
$parentrps.Submenus.Add(' Open-ExchangeOnline',{ Invoke-Expression "$env:HOMEPATH\Documents\WindowsPowerShell\RemotePS\ExchangeOnline.ps1"}, $null) | Out-Null
$parentrps.Submenus.Add(' Azure-ADConnect',{ Invoke-Expression "$env:HOMEPATH\Documents\WindowsPowerShell\RemotePS\azure-ad-connect.ps1"}, $null) | Out-Null
$parentrps.Submenus.Add(' Remove-PSSession',{ Invoke-Expression "$env:HOMEPATH\Documents\WindowsPowerShell\RemotePS\ExchangeOnline-exit.ps1"}, $null) | Out-Null
$parentrps.Submenus.Add(' Exit-RemotePS',{ Invoke-Expression Exit-PSSession; $host.ui.RawUI.WindowTitle = "Windows Powershell ISE no remote connection" }, $null) | Out-Null
#add ise menu backupprofil
$parentbackup = $psise.CurrentPowerShellTab.AddOnsMenu.SubMenus.Add('Backup', $null, $null)
$parentbackup.Submenus.Add(' BackupPSProfile',{ Invoke-Expression "$env:HOMEPATH\Documents\WindowsPowerShell\Backup\profile-backup.ps1"}, $null) | Out-Null

Soweit der erste Teil meiner Reihe.

Im zweiten Teil stelle ich die Loggin/Certman Funktion vor. Dieser folgt bald.

Print Friendly, PDF & Email
  • Was this Helpful ?
  • yes   no