Archiv der Kategorie: Scripting

PowerShell: Arbeiten mit dem Profile

Wer nicht immer das Standard PowerShell Fenster benutzen möchte, der kann dieses mittels eines Profiles einfach bei jedem Start von PowerShell anpassen.

Diese Datei liegt normalerweise unter „eigene Dokumente\WindowsPowerShell\Microsoft.PowerShell_profile.ps1“, allerdings kann dies je nach Benutzerumgebung variieren.

Den genauen Standort kann man sich in der PowerShell mit der Systemvariablen „$profile“ anzeigen lassen:PowerShell profileDa es sich hier um ein ganz normales PowerShell-Script (*.ps1) handelt, kann man es auch ganz einfach so befüllen.

In meinem Profile lasse ich mir direkt beim Start alle SnapIns sowie Module laden (auch wenn dies die PowerShell etwas aufbläht). Dies hat den Vorteil, das man direkt alle CMDLETS des Systems zur Verfügung hat.

Des weiteren lege ich ein Transscript (LOG-Datei) an, damit ich auch später nachvollziehen kann, was ich getan habe.


write-host -fore red "### Alle verfügbaren Module laden... ###"
Get-Module -ListAvailable | % { import-module $_.Name; write-host $_.Name }
write-host ""
write-host -fore red "### Alle Snapins laden... ###"
@(Get-PSSnapin -Registered) | % { Add-PSSnapin -Name $_.Name; write-host $_.Name }
Set-QADPSSnapinSettings -DefaultSizeLimit 0
write-host ""
write-host -fore red "### Variablen und Transcript setzen ###"
$MyDate = Get-Date -Format yyyy-MM-dd_H-m-s_$env:computername
$MyLibDir = "z:\Programme\PowerShell"
$MyTransDir = "Z:\Programme\PowerShell\Transcript"
$Transcript = "$MyTransDir\Transcript_$MyDate.txt"
$MyPROD = "z:\programme\powershell\prod"
$MyTEST = "z:\programme\powershell\test"
Start-Transcript
write-host ""
write-host -fore red "### eigene Libraries laden ###"
get-childitem $MyLibDir\Modules\PS | foreach-object {. $_.fullname}
get-childitem $MyLibDir\Modules\OWN | foreach-object {. $_.fullname}

Einige Pfade kann man hier der besseren Übersicht halber auch noch in Variablen packen, dies ist aber für diese Beispiel nicht notwendig.

PowerShell: Wiederholung von PowerShell-Befehlen

Auch die PowerShell merkt sich, wie jeder ordentliche Kommandointerpreter, die während der Sitzung eingegebenen Befehle. Somit kann man diese erneut verwenden, ohne diese neu eintippen zu müssen.

Diese gelten im übrigen (zum Teil) auch noch für die etwas betagte Eingabeaufforderung (cmd.exe) von Windows.

Am einfachsten ist die Möglichkeit dies mittels den Cursor-Tasten zu tun. Jedoch wird dies bei mehr als fünf Befehlen recht mühsam.

Besser ist da schon die Möglichkeit mit der Taste F7, diese zeigt eine Liste aller eingegebenen Befehle an. Navigiert wird auch hier mittels Cursor-Tasten.

Weitaus besser ist die Möglichkeit mit F8, hier kann dann auch vorgefiltert werden. Hierzu einfach einen Teil des Befehls eingeben und mit F8 durchblättern.

Sofern man die genaue ID des Befehls kennt (kann man gut mit F7 sehen), kann man diesen direkt mit F9 ausführen.

Editieren kann man den vorherigen Befehl natürlich auch, dies geht mit F2 (Kopieren bis Zeichen) und F4 (Löschen bis Zeichen).

 

Cmdlets zum Anzeigen der Historie

Es gibt auch ein passendes Cmdlet zur Anzeige der Historie, allerdings zeigt es nur bis max. 64 Befehle an: Get-History (alias history). Mit dem Schalter -count kann man die Ausgabe auf die letzten x Befehle reduzieren (in diesem Beispiel auf 20):

Get-Historie -count 20

Kennt man die ID des Befehls, kann man diesen auch direkt ausführen:

Get-Historie -ID <id>

Wesentlich besser ist jedoch der Einsatz eines Filters, hierbei ist das Select-String Cmdlet sehr hilfreich:

Get-Historie | Select-String „WMI“

In diesem Fall würden alle Befehle ausgegeben, die „WMI“ enthalten.

Die Historie der Befehle kann natürlich auch als csv-Datei exportiert werden:

Get-History | Select -unique | Convertto-Csv > historie.csv

 

Logfile der eingegebenen Befehle mitschreiben

Es ist natürlich auch möglich die Historie direkt in eine Datei mitloggen zu lassen. Hierzu macht man sich das Transcript zu nutze. Zuerst muss das Logfile festgelegt werden:

$Transcript = c:\log\mylog.txt

Danach wird dann noch das Transcript gestartet mit

Start-Transcript

Um das Transcript wieder zu beenden, einfach folgendes eingeben:

Stop-Transcript

Ich habe mir hierzu im PowerShell Profile folgende Zeilen angelegt:

$MyDate = Get-Date -Format yyyy-MM-dd
$MyLibDir = „z:\Programme\PowerShell“
$MyTransDir = „Z:\Programme\PowerShell\Transcript“
$Transcript = „$MyTransDir\Transcript_$MyDate.txt“
Start-Transcript

Die Profildatei kann über die Variable $profile erreicht werden. Um dieses mit dem Notepad zu editieren folgenden Befehl eingeben:

notepad $profile

 

Zusammenfassung der Tastenkürzel

Cursor-Tasten –> Befehle in Cursorrichtung einzeln anzeigen
F7 –> Liste der Befehle
F8 –> Filter auf Befehle
F9 –> Befehl mit bestimmter ID ausführen
F2 –> Kopieren bis Zeichen
F4 –> Löschen bis Zeichen

Internet Explorer: IE ganz schlicht starten (Kiosk Mode/App Mode)

Auch der Internet Explorer läßt sich in einem schlichten Gewand starten. Hierzu wird allerdings ein kleines PowerShell Script benötigt:

function OpenURL([string] $url)
{
$ie = new-object -comobject „InternetExplorer.Application“
$ie.visible = $true
$ie.navigate($url)
$ie.ToolBar = $false
$ie.StatusBar = $false
$ie.MenuBar = $false
$ie.AddressBar = $false
$ie.Resizable = $true
}
OpenURL http://www.shalm.de

Hier das Script zum Download: Click mich!

AD: Verweiste Computerkonten finden

In einem größeren Active Directory (AD) kommt es mit der Zeit vor, das es alte Computerkonten gibt, welche nicht mehr benutzt werden. Dies kommt zustande, wenn Server oder Clients abgebaut werden ohne das das dazugehörige Computerkonto gelöscht wird.

Dies gilt auch, wenn ein Computer zwar aus der Domäne entfernt wird, das Computerkonto bleibt bestehen und muß noch gelöscht werden.

Auch durch die heutigen virtualisierten Umgebungen, wo sehr schnell Rechner auf- und abgebaut werden können, entstehen immer mehr solcher Karteileichen.

Windows liefert hier eigentlich alle Tools mit, um diese Karteileichen zu finden: dsquery und PowerShell 3.0!

Sobald ein Computer aus der Domäne entfernt wird, wird das Computerkonto disabled. Diese Computerkonten kann man recht einfach heraus finden:

dsquery computer -disabled

In PowerShell 3.0 sieht es dann so aus:

Search-ADAccount -AccountDisabled -ComputersOnly

 Ist man sich dann sicher, das alle gesperrten Computerkonten gelöscht werden sollen, kann man dies so tun:

dsquery computer -disabled | dsrm

Alternativ natürlich auch mit PowerShell 3.0:

Search-ADAccount -AccountDisabled -ComputersOnly | Remove-ADComputer

 

Etwas schwieriger gestaltet sich das Problem bei inaktiven Computern. Diese sind beispielsweise einfach abgebaut worden, ohne das einem AD-Admin bescheid gesagt wurde. Gründe hierfür gibt es verschiedene.

Auch Außendienstmitarbeiter sind hier zu finden, wenn diese sich länger mit ihrem Computer nicht im Firmennetz aufgehalten haben.

Hier einen entsprechenden Inaktivitätszeitraum zu finden, sollte jeder selbst entscheiden und nach seiner Umgebung anpassen können.

Mit dsquery kann man diese Rechner recht schnell finden:

dsquery computer -inactive 6 -limit 0

Der Parameter inactive gibt hierbei die Anzahl der Wochen an, limit die Anzahl der maximalen Einträge (0=unendlich).

Mit PowerShell 3.0 ist dies natürlich auch möglich:

Search-ADAccount -AccountInactive -ComputersOnly -TimeSpan 42.00:00:00

Damit diese Computerkonten nicht sofort gelöscht werden, empfiehlt es sich, diese erstmal zu disablen:

dsquery computer -inactive 6 | dsmod computer -disabled yes

 Mit PowerShell 3.0 geht dies so:

Search-ADAccount -AccountInactive -ComputersOnly -TimeSpan 42.00:00:00 | Set-ADComputer -Enabled 0

Wer mag, kann dies dann natürlich auch automatisieren.

 

Für die Mausschubser gibt es aber auch eine nette Freeware: AD Tidy

 

PS: PowerShell 3.0 unter Windows 7

Mit dem Windows Server 2012 bzw. Windows 8 stellt Microsoft auch die PowerShell 3.0 zur Verfügung.

In der neuen Version sind einige nützliche Cmdlets hinzu gekommen, welche auch hier im Blog an verschiedenen Stellen zum Einsatz kommen.

Da es für Windows 7 keinen direkten PowerShell Download mehr gibt, hat Microsoft die PowerShell mit in das Windows Management Framework aufgenommen.

Der entsprechende Download ist hier zu finden: Click mich!