Archiv der Kategorie: DevOps Tutorials

Tutorials for DevOps & Scripting Deploying and Technical contribution for Professionals

PowerShell Loop Hands-On

Beim programmieren kommen oft Arrays und Schlaufen-(Loops) zur Anwendung, so auch beim arbeiten mit PowerShell Scripts. In folgendem Beispiel werden 4 Array Werte angelegt, diese mittels der ID wieder aufgerufen werden.

Ein Array erstellt man mit folgendem Befehl:
PS C:\>
$array = @("sandwich","salad","beer","espresso")
Write-Host $array[0,1,2,3]
Mit For-Schleife Array Werte ausgeben:

Die Länge des Arrays, bzw. die Anzahl der gespeicherten Werte, wird mit $array.length ausgelesen. Die Variable ($i) dient als Zähler, um zu Zählen wann die Schleife verlassen werden soll. Dem Zähler wird ein Startwert zugewiesen ($i=0). Der Startwert soll bei jedem Durchlauf der Schleife um 1 erhöhen ($i++) bis der Endwert erreicht ist. Der Endwert ist die Länge des Array ($array.length). Bei der Überprüfung des Endwert gibt es eine Bedingung: solange $i kleiner der Anzahl der Werte ($i -lt $array.length) ist.

powershellFor loop
for ($i=0; $i -lt $array.length; $i++){
  Write-Host $array[$i] 
}

Die For-Schleife: for ($i=0; $i -lt $array.length; $i++)
Startwert $i=0: Die Variable $i startet mit dem Wert 0
ist $i kleiner (-lt) $i -lt $array.length Bedingung: die For Schleife wird solange ausgeführt, solange diese Bedingung erfüllt ist: solange die Variable $i kleiner als $array.length ist, solange also $i kleiner 4 ist. Die Aktion beim Durchlauf der Schleife: $i++ bedeutet, den Wert der Variable $i um 1 erhöhen, bei jedem Durchlauf der Schleife wird $i um 1 grösser: 0 .. 1 .. 2 .. 3 …

while loop
$i=0
while ($i -lt $array.length){
  Write-Host $array[$i] 
  $i++
}

Beispiel mit Startwert $i vor der Schleife definiert ($i=0)
while ($i -lt $array.length){
Innerhalb von while steht die Bedingung für den Durchlauf der Schleife, der Loop wid nicht verlassen, solange diese erfüllt ist:
$i -lt $array.length … solange $i kleiner $array.length ist
Die Variable $i wird innerhalb der Schleife jeweils um den Wert 1 erhöht: $i++

Endless Loop

while kann für eine Endlosschleife wie folgt verwendet werden: mit break kann die Endlosschleife wieder verlassen werden. Folgendes Beispiel durchläuft die Schleife bis break ausgeführt wird, dies geschieht wenn $i nicht mehr kleiner dem Wert 10 ist:

$i=0
while($true) {
  $i++
  write-host $i
  if ($i -ge 10) {break}
}
do loop
$i=0
do{
  Write-Host $array[$i] 
  $i++
} while ($i -lt $array.length)
foreach
foreach ($i in $array){
  Write-Host $i 
}

foreach ($i in $array)  Aufruf aller Werte des Array ($array). Die Variable $i enthält bei jedem Durchlauf den aktuell ausgelesenen Wert.

Operators Variations:

-gt greater than
-igt greater than, case-insensitive
-cgt greater than, case-sensitive
-ge greater than or equal
-ige greater than or equal, case-insensitive
-cge greater than or equal, case-sensitive
-lt less than
-ilt less than, case-insensitive
-clt less than, case-sensitive
-le less than or equal
-ile less than or equal, case-insensitive
-cle less than or equal, case-sensitive

Benutzer SID abfragen VBScript

Benutzer SID, Security Identifier abfragen mit VBScript GetSID.vbs. Die SID ist ein eindeutiger Sicherheits-Identifikator, den Microsoft Windows automatisch vergibt, um jedes System, jeden Benutzer und jede Gruppe dauerhaft zu identifizieren.

Benutzer SID abfragen mit GetSID.vbs, und in Notepad ausgeben.

'Description: Zeigt alle Benutzerkonten und SID
'Prerequisite: Windows

Set WshShell = CreateObject("Wscript.Shell")
Set fso = Wscript.CreateObject("Scripting.FilesystemObject")
fName = WshShell.SpecialFolders("Desktop") & "\GetSID.txt"
Set b = fso.CreateTextFile(fName, true)
b.writeblanklines 1
b.writeline string(61,"*")
b.writeline "Benutzerkonten mit SIDs und Profile-Pfade."
b.WriteLine "GetSID.vbs - 2010 by Don Metteo"
b.WriteLine "https://think.unblog.ch"
b.writeline string(61,"*")
b.writeblanklines 1

strProfileBranch = "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\"
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colAccounts = objWMIService.ExecQuery _
 ("Select * From Win32_UserAccount")

For Each objAccount in colAccounts
 If objAccount.Name = "HelpAssistant" or objAccount.Name = "SUPPORT_388945a0" then
 else
 b.writeline "Username : " & objAccount.Name
 b.writeline "SID : " & objAccount.SID
 b.writeline "Profile Path : " & GetHomePath(objAccount.SID)
 b.writeblanklines 1
 end if
Next

Function GetHomePath(strSID)
 On Error Resume Next
 GetHomePath = WshShell.ExpandEnvironmentStrings(Trim(WshShell.RegRead (strProfileBranch & strSID & "\ProfileImagePath")))
 On Error Goto 0
End Function

b.writeline string(61,"*")
b.close
WshShell.Run "notepad.exe " & fName

Set fso = Nothing
set Wshshell = Nothing

Nach dem Ausführen des VBScriptes wird die Abfrage der Benutzer SID im Notepad geöffnet.

Benutzer SID abfragen VBScript

Anmerkung

An die SID sind die in Access Control Lists festgelegten Zugriffsrechte gebunden. Wenn die Namen von Systemen, Benutzern oder Gruppen geändert werden, bleiben deren SID unverändert. Deshalb bleiben ihnen alle Zugriffsrechte erhalten. SID ermöglichen also, die Namensgebung problemlos zu ändern.

SID des Betriebssystems

Während der Installation des Betriebssystems erhält das System selbst seinen SID durch einen Zufallszahlengenerator. Dies ist erforderlich, damit eine eindeutige Kennzeichnung im Netzwerk gewährleistet ist. Anschließend werden sogenannte well-known SID vergeben, die auf jedem System gleich sind. Zum Beispiel für die Gruppe Administratoren.

SID des Benutzers

Der SID eines Benutzers wird automatisch erstellt, wenn dieser angelegt wird. Der SID eines lokal angelegten Benutzers basiert auf dem SID des Systems. Eine SID in einer Domäne angelegten Benutzers ändert sich, wenn er von einer Domäne in eine andere verschoben wird, da im SID auch die Domäne des Benutzers hinterlegt wird. Die Benutzer SID kann man abfragen mit dem VBScript GetSID.vbs, die Benutzer SID wird in notepad.exe ausgeben.