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.

For 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

-eq  ist gleich
-ne  ist nicht gleich
-gt  ist grösser als
-ge  ist grösser oder gleich
-lt  ist kleiner als
-le  ist kleiner oder gleich

VBScript GetSID.vbs

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

Mit dem VBScript GetSID.vbs lassen sich die SID von Windows ausgeben.

'Description: Zeigt alle Benutzerkonten und SID
'Created on : Apr 5, 2010
'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 Scriptes werden die SID im Notepad geöffnet.

GetSID.txt

VBScript whoami.vbs

Mit dem VBScript whoami.vbs wird die aktuelle IP-Adresse, der Computer und der Benutzername unter Windows ausgegeben.

' VBScript Source File Created for any
' NAME: whoami.vbs

Const HKCR = &H80000000
Const HKCU = &H80000001
Const HKLM = &H80000002
Const HKU = &H80000003

Set fs = CreateObject("Scripting.FileSystemObject")

'**********************************
'ComputerName aus Registry auslesen
'**********************************

s_Key = "SYSTEM\CurrentControlSet\Control\ComputerName\ActiveComputerName"

s_Wert = "ComputerName"
Set wmireg = GetObject("winmgmts:root\default:StdRegProv")

result = wmireg.GetStringValue(HKLM, s_Key, s_Wert, s_ComputerName)

'**********************************
'UserName aus Registry auslesen
'**********************************

s_Key = "SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon"

s_Wert = "DefaultUserName"
Set wmireg = GetObject("winmgmts:root\default:StdRegProv")

result = wmireg.GetStringValue(HKLM, s_Key, s_Wert, s_UserName)

'*****************************************
'IPConfig Daten auslesen und echo ausgeben
'*****************************************

strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")

Set IPConfigSet = objWMIService.ExecQuery _
    ("Select * from Win32_NetworkAdapterConfiguration Where IPEnabled=TRUE")

Set colAdapters = objWMIService.ExecQuery _
    ("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True")

For Each IPConfig in IPConfigSet
   If Not IsNull(IPConfig.IPAddress) Then
      For i=LBound(IPConfig.IPAddress) to UBound(IPConfig.IPAddress)
      ausgabe = Wscript.Echo ("IP Address " & IPConfig.IPAddress(i) & vbCrLf & "Computer " & s_ComputerName & vbCrLf & "Username " & s_UserName)
      Next
   End If
Next