Powershell, Karten 91-120

Powershell Grundlagen

Powershell Grundlagen


Roger Aschwanden
Diese Lernkarten bieten eine vertiefte Einführung in die Nutzung von PowerShell für administrative Aufgaben auf Berufslehrniveau. Sie konzentrieren sich auf das Arbeiten mit Befehlen, Objekten und Diensten, insbesondere durch die Verwendung von WMI-Objekten und Methoden. Die Karteikarten zeigen, wie man Sessions erstellt, Text ausgibt, Eingabemasken verwendet und Variablen definiert. Sie eignen sich für IT-Profis, die ihre Fähigkeiten in der Automatisierung und Verwaltung von Systemen mit PowerShell erweitern möchten.
Karten
13
Lernende
2
Sprache
Deutsch
Kategorie
Informatik
Stufe
Berufslehre
Erstellt / Aktualisiert
08.12.2015 / 19.01.2022

Lernkarten

Können Powershell jobs welche von anderen Usern gestartet worden sind angeschaut werden?

Nein, ausser Scheduled Jobs

das folgende Command funktioniert nicht. Wieso und wie kann es erfolgreich umgesetzt werden?
gwmi win32_networkadapterconfiguration -filter "description like '%intel%'" | EnableDHCP()

Objekte können nicht zu Methoden "gepiped" werden. Command Invoke-WmiMethod verwenden:
gwmi win32_networkadapterconfiguration -filter "description like '%intel%'" | Invoke-WmiMethod -name EnableDHCP
Oder besser Get-CimInstance und Invoke-CimMethod verwenden.
Get-CimInstance -classname win32_networkadapterconfiguration -filter "description like '%intel%'" | Invoke-CimMethod -methodname EnableDHCP

Der Output von Invoke-WmiMethod kann verwirrend sein. Es werden viele System Properties Bsp: __GENUS angezeigt (fangen mit 2 _ an). Wichtig ist der ReturnValue, online prüfen was dies bedeuted.
Evtl. gibt es in neueren Powershell Version bereits besser cmdlets (Wrapper) für diese Anwendung.

Wieso gibt dieses command einen Fehler? ($null=ändert den Paramenter nicht, lässt ihn wie er war)
gwmi win32_service -filter "name = 'BITS'" | invoke-wmimethod -name change -arg $null,$null,$null,$null,$null,$null,$null,"P@ssw0rd"

Manchmal ist es auch besser einen anderen Ansatz zu wählen als dem Problem auf den Grund zu gehen.
Get-WmiObject Win32_Service -filter "name = 'BITS'" | ForEach-Object -process { $_.change($null,$null,$null,$null,$null,$null,$null,"P@ssw0rd")}

Was ist der Unterschied zwischen diesen 5 commands?
Get-Service -name *B* | Stop-Service
Get-Service -name *B* | ForEach-Object { $_.Stop() }
Get-WmiObject Win32_Service -filter "name LIKE '%B%' | Invoke-WmiMethod -name StopService
Get-WmiObject Win32_Service -filter "name LIKE '%B%' | ForEach-Object { $_.StopService() }
Stop-Service -name *B*

Kein Unterschied, alle Stoppen den/die Services mit einem B im Namen.

Was ist der Output? Was ist der Unterschied?
$computername = 'SERVER-R2'
$var = 'What does $computername contain?'
$var = "What does $computername contain?"

'' -> varialben werden nicht interpretiert. Durch ein Backtick "`" findet auch keine Interpretation statt.
What does $computername contain?
What does SERVER-R2 contain?

Was macht `n?
Bsp. command. echo "was macht `ndas?"

Output (new line):
was macht
das
help about_escape um mehr solche Spezialfälle zu erhalten.

Was ist der Unterschied? Wie kann das ab Powershell v3 gemacht werden?
Get-Service | ForEach-Object { Write-Output $_.Name }
Get-Service | Select-Object –ExpandProperty Nam

Kein Unterschied, in v3 noch einfacher:
$services = Get-Service
$services.Name

Was ist der Output? Was ist es zu beachten?
$services = get-service
$firstname = "The first name is $($services[0].name)"

Output:
The first name is AeLookupSvc
$() wird interpretiert aber NUR in "".

Wie kann der Variable $test der Typ Integer definiert werden. z.B für den wert 6
Welche anderen Typen gibt es noch?

[int]$test = 6

[int]—Integer numbers
[single] and [double]—Single-precision and double-precision floating numbers
(numbers with a decimal portion)
[string]
[char]—Exactly one character
[xml]—An XML document; whatever string you assign to this will be parsed to
make sure it contains valid XML markup (for example, [xml]$doc = Get-Content
MyXML.xml)
[adsi]—An Active Directory Service Interfaces (ADSI) query; the shell will execute
the query and place the resulting object or objects into the variable (such
as [adsi]$user = "WinNT:\\MYDOMAIN\Administrator,user")
Das sind nicht alle aber die am meisten verwendeten

Wie kann eine Eingabe gemacht werden. Z.B einen Hostnamen eingeben lassen.

$computername = read-host "Bitte Computernamen eingeben: "
Dabei ist abhängig von der Application ob eine Eingabemaske, command Prompt oder sonst was geöffnet wird.

Wie kann eine Eingabemaske für Eingaben verwerdet werden und nicht der command prompt?

 

run once per Session:
[void][System.Reflection.Assembly]::LoadWithPartialName('Microsoft.VisualBasic')

$computername = [Microsoft.VisualBasic.Interaction]::InputBox('Enter a computer name','Computer Name','localhost')
-first parameter is the text for your prompt.
-second parameter is the title for the prompt’s dialog box.
-third parameter, which can be left blank or omitted entirely, is the default value that you want prefilled in the input box.

Wie kann ich text ausgeben? z.B "das ist eine Ausgabe"
Gibt es noch andere Möglichkeiten?

write-host "das ist eine Ausgabe"
write-host sendet direkt an den Screen, nicht via "out-default und out-host" Anpassung von Farbe ist möglich.
write-output sendet in die Pipeline (default).
Bsp:
write-output "Hello" | where-object { $_.length -gt 10 } #Kein Output, wird gefiltert
write-host "Hello" | where-object { $_.length -gt 10 } #Hello wird direkt an Screen gesendet.

write-warning, write-verbose, write-debug, write-error (different)
write-verbose ist vorzuziehen wenn möglich.

Mit Session arbeiten
Wie kann eine Remote Session erstellt/gespeichert/gelöscht/gearbeitet werden?

 

Session erstellen:
$iis_servers = new-pssession -comp web1,web2,web3 -credential WebAdmin #session müssen nicht gespeichert werden, powershell hat eigene Liste

Session löschen: #werden beim schliessen der shell automatisch gelöscht
get-pssession | remove-pssession
$iis_servers | remove-pssession

Session zugreiffen:
Get-PSSession -ComputerName SERVER-R2 | Enter-PSSession

Mit invoke-Command und Sessions arbeiten:
invoke-command -command { get-wmiobject -class win32_process } -session $sessions
invoke-command -command { get-wmiobject -class win32_process } -session (get-pssession -comp loc*)

Lernen