Fragensteller
Suche konstruktive Kritik für Skriptversuch

Allgemeine Diskussion
-
Hallo Zusammen,
ich bin noch blutiger Anfänger im Powershell Bereich und verusche nach den ersten Büchern nun die typischen Aufgaben in eigenen Skripten zu lösen um Übung zu bekommen und bei der Recherche mein Wissen zu vertiefen und auszubauen.
Es wäre toll, wenn ihr mir für das untige Skript konstruktive Verbesserungsvorschläge macht, wie ich etwas eleganter/besser lösen könnte, wo ich Murks gemacht hab oder was noch sinnvoll auszubauen ist.
Danke schonmal für die Rückmeldungen!
Die Aufgabe des folgenden Skripts ist eine typische in Büchern und Übungen: Ändere das Kennwort eines Dienstusers (klasischen, nicht 2008 Servicekonten) im AD und auf den übergebenen Computern, falls da ein Dienst mit diesem User konfiguriert wurde.
<# .SYNOPSIS Change Password for AD User and Services where it is configured .DESCRIPTION Set-ServicePassword changes the Password for a AD User which is used in Services. The script first change the Password in AD, then connect to the remote Machine with a PSSession and changes the Service Startup Accounts Password .PARAMETER Computername .PARAMETER ServiceUser .PARAMETER Password .EXAMPLE Set-ServicePassword -Computername Server1 -Service BITS -ServiceUser Testuser1 #> [CMDletBinding()] param ( [Parameter(Mandatory=$true)] [Alias('hostname')] [Array]$Computername, [Parameter(Mandatory=$true)] [string]$ServiceUser = (Read-Host -Prompt "sAMAccountName vom Dienst User eingeben"), [string]$Password ) Set-StrictMode -Version Latest If ($Password) { $newPassword = $Password | ConvertTo-SecureString -AsPlainText -Force $unsecurePassword = $Password } else { $newPassword = (Read-Host -Prompt "Neues Kennwort eingeben" -AsSecureString) [string]$unsecurePassword = [Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($newPassword)) } $Sessions = @{} Write-Verbose "Ändere Passwort für den AD-User $serviceUser" Set-ADAccountPassword -Identity $serviceUser -NewPassword $newPassword -Reset If ($? -eq $true) { foreach ($computer in $Computername) { If ($Sessions.ContainsKey("$Computer") -ne $true) { Write-Verbose "Erstelle ein Verbindungsobjekt mit Computer: $Computer" $Sessions["$computer"] = New-PSSession -ComputerName $Computer Write-Verbose "Suche nach allen Diensten wo der Account $ServiceUser auf Computer: $Computer konfiguriert ist" Invoke-Command -Session $Sessions["$computer"] -ArgumentList $ServiceUser,$unsecurePassword -ScriptBlock { Param ($serviceuser,$unsecurePassword) $Dienst = Get-CimInstance -ClassName Win32_Service -Filter "StartName LIKE '$serviceUser%'" Write-Host "Folgende Dienste wurden gefunden: $($Dienst.Name)" If ($Dienst -ne $null) { ForEach ($svc in $Dienst) { Write-Host ".........." Write-host "Dienst $($svc.Name) wird bearbeitet!" Write-Host ".........." Write-Host "Ändere das Kennwort vom Dienst $($svc.Name) auf Computer: $env:COMPUTERNAME " -ForegroundColor Green $chpw = Invoke-CimMethod -InputObject $svc -MethodName Change -Arguments @{StartPassword = $unsecurePassword} If ($chpw.ReturnValue -ne 0) { Write-Host "Fehler beim Ändern des Kennworts für den Dienst $($svc.Name) auf Computer: $env:COMPUTERNAME. Fehlercode $($chpw.Returnvalue)" -ForegroundColor Red } Write-Host "Dienst $($svc.Name) wird gestoppt" -ForegroundColor Green $stopsvc = Invoke-CimMethod -InputObject $svc -MethodName StopService If ($stopsvc.ReturnValue -ne 0) { Write-Host "Fehler beim Stoppen des Diensts $($svc.Name) auf dem Computer: $env:COMPUTERNAME. Fehlercode $($stopsvc.Returnvalue)" -ForegroundColor Red } Write-Host "Dienst $($svc.Name) wird gestartet" -ForegroundColor Green $startsvc = Invoke-CimMethod -InputObject $svc -MethodName StartService If ($startsvc.Returnvalue -ne 0) { Write-Host "Fehler beim Starten des Diensts $($svc.Name) auf dem Computer: $env:COMPUTERNAME. Fehlercode $($startsvc.Returnvalue)" -ForegroundColor Red } } } else { Write-Host "Es konnte kein Dienst auf Computer: $env:COMPUTERNAME mit dem Dienstkonsto $serviceuser gefunden werden!" -ForegroundColor Red } } Write-Verbose "Remote-Sessions für Computer: $computer werden geschlossen" $Sessions["$Computer"] | Remove-PSSession } } } else { Write-Host "Fehler beim Kennwort setzen für Benutzer $ServiceUser" }
Gruss
Bastian
- Bearbeitet baschuel Sonntag, 6. Januar 2013 21:17
Alle Antworten
-
Das beantworten solcher anfragen Kostet sehr viel Zeit!
So etwas ist Mündlich in ein paar Minuten abgehandelt, schriftlich ist das aber ein ganzer Roman!
Dies grenzt dann schon an einen Fernlehrgang!
Ich kenne auch keine anderen Foren wo so etwas ausführlich besprochen wird.Ich Antworte dir heute Abend!
Please click “Mark as Answer” if my post answers your question and click “Vote As Helpful” if my Post helps you.
Bitte markiere hilfreiche Beiträge von mir als “Als Hilfreich bewerten” und Beiträge die deine Frage ganz oder teilweise beantwortet haben als “Als Antwort markieren”.
My PowerShell Blog http://www.admin-source.info
[string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
German ? Come to German PowerShell Forum! -
Das du PowerShell Bücher liest finde ich sehr gut!
Hast du auch das Buch von Bruce Payette; PowerShell in Action? (second edition)(Englisch)
Dies eröffnet dir sehr viele PowerShell Internas.
Ebenfalls sieht dein Script schon sehr ordentlich aus.
Jeder hat natürlich seinen eigenen Script-Style. Die folgenden aufgeführten Tipps sind natürlich teilweise Persönliche "Geschmackssache" und keine festen Regeln!
Du hast hier ein Advanced Script erstellt das im Grunde genommen dasselbe wie eine Advanced Function ist.
Wenn du mehrere ähnliche Scripte hast, wäre es zu überlegen, ob es nicht sinnvoller ist deinen gesamten Code in eine Function zu packen, die Functions zu sammeln und aus den Script-Dateien, ein .PSM1 Modul zu machen (einfach nur die Dateiendung ändern).
1. Ich würde in der commendbased Help auch Einrückungen vornehmen und Parameter erklären.
Die Parameter nur anzugeben ohne zu erklären wofür die sind macht keinen Sinn!
<#
.SYNOPSIS
Change Password for AD User and Services where it is configured
.DESCRIPTION
Set-ServicePassword changes the Password for a AD User which is used in Services. The script first change the Password in AD,
then connect to the remote Machine with a PSSession and changes the Service Startup Accounts Password
.PARAMETER Computername
One or more target Computername(s) or IP adresse(s) on those these command is supposed to work
…..
#>
2. [CMDletBinding()] ist das Attribut für param(), diese gehören zusammen. Deshalb würde ich keinen Leerraum zwischen diesen lassen (auch wenn es in der Dokumentation nicht gemacht wird):
[CMDletBinding()]
param()
3. [string]$ServiceUser = (Read-Host -Prompt "sAMAccountName vom Dienst User eingeben")
Hier ist die Zuweisung über Read-Host unnötig, da Mandatory Parameter von der PowerShell immer abgefragt werden wenn sie nicht angegeben werden! In diesem Fall wird die HelpMessage angezeigt (siehe Code Beispiel).
4. Wenn man [Parameter(Mandatory=$true)] verwendet sollte man immer in Erwägung ziehen das man auch einen Position angibt und ob der Parameter Values aus der Pipeline akzeptiert:
5. [Array]$Computername ist nicht Typsicher! Da ein Array auch ein Gemisch von Objekten enthalten kann.
[String[]]]$Computername wäre hier besser, dann muss das Array nur Strings enthalten.
6. Ein Advanced Function/Script sollte IMMER mindestens den Process Block beinhalten, da die Function/Script nur dann in einer Pipline richtig funktioniert! (begin{}, process{}, end{} Blöcke)
Param()
Process {
# Code Hier !
}
7. Dinge wie Set-StrictMode -Version Latest oder #requires sollten immer als erste Zeilen in einem Script stehen. Damit sie auf das gesamte script wirken und nicht im Code "versteckt" sind.
8. Die Variable $unsecurePassword ist unnötig da ja $unsecurePassword = $Password ist!
Hier könnte man es folgendermassen schreiben:
If ($Password) {
$newPassword = $Password | ConvertTo-SecureString -AsPlainText -Force
} else {
$newPassword = (Read-Host -Prompt "Neues Kennwort eingeben" -AsSecureString)
[string]$Password = [Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($newPassword))
}
9. Passwörter werden als securestring im Speicher abgelegt. Damit diese auch im Speicher nicht im Klartext auslesbar sind (angriff auf den RAM-Speicher). Wenn man ein Passwort gleichzeitig in einer anderen Variablen ($unsecurePassword) im Klartext ablegt, macht der securestring keinen Sinn mehr!
Deshalb würde ich das Passwort immer nur in einer Variablen als securestring halten
If ($Password) {
$Password = $Password | ConvertTo-SecureString -AsPlainText -Force
} else {
$Password = (Read-Host -Prompt "Neues Kennwort eingeben" -AsSecureString)
}
Wenn du einen unsecurePassword brauchst, dann würde ich diesen IMMER on the fly entschlüsseln OHNE dieses in eine Variable abzulegen!
$([Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($newPassword)))
Das ist zwar unbequemer aber sicherer! ;-)
10. Da du das Passwort aber an andere Computer übergeben must macht das ganze securestring Gerödel keinen Sinn! Es gibt nur eine Stelle wo du ein securestring brauchst. Dort kannst du es auch direkt wandeln!
Set-ADAccountPassword -Identity $serviceUser -NewPassword ($Password | ConvertTo-SecureString -AsPlainText –Force) –Reset
11. Da du mit der If ($Password) { …} abfrage eine Passworteingabe erzwingst, kannst du den Parameter $Password auch Mandatory machen und die If Abfrage vergessen!
12. If ($Sessions.ContainsKey("$Computer") -ne $true) finde ich lustig! Warum nicht einfach:
If ($Sessions.ContainsKey("$Computer") -eq $False) ? Das ist glaube ich klarer!3. Bevor du versuchst mit dem Computer eine session aufzubauen solltes du mit Test-Connection (Ping) testen ob der Computer erreichbar. Dies ist unter Umständen schneller und vermeidet errors.
14a. Du erstellst (öffnest) mit New-PSSession für jeden Computer einen Session und sammelst diese in einer Hashtable. Wenn du viele Computer hast ist schnell dein Speicher voll! Sessions verbrauchen (viel) Speicher deshalb sollten Sie so schnell wie möglich wieder geschlossen werden.
New-PSSession ist hier Unnötig!
Invoke-Command –Computername erstellt eine Session Automatisch, der Scriptblock wird ausgeführt und die Session wird danach automatisch wieder geschlossen!
Hier kann man sich überlegen ob man Invoke-Command zusätzlich –AsJob startet, dies wird dann schneller in der gesamt Abarbeitung.
14a. Nimmst du hier absichtlich eine Hashtable für $Sessions? Kennst du den Unterschied zwischen Hashtable @{} und Array @()?
15. Wenn du vermeiden willst das ein Computer doppelt verarbeitet wird, nutze $Sessions als einfaches String Array anstatt alle speicherfressenden Sessions in dieser Variablen zu halten!
(ich habe $Session umbenannt in $ProcessedComputers)
$Sessions = @()
$Sessions += $Computername
IF ($Session –contains $Computername) { ….. }
16. Im Scriptblock von Invoke-Command benutzt du nur CIM Cmdlets.
Ich habe mit CIM noch nicht gearbeitet
Die neuen CIM Cmdlets gibt es nur in der PowerShell 3.0! Haben alle Zielrechner PowerShell 3.0?
Windows 7 hat standardmäßig PowerShell 2.0 und XP nur 1.0! Kein 3.0 !
Alternativ musst du WMI (Get-WMIObject) benutzen.
17. Zusätzlich zu jedem Write-Host würde ich die (Fehler-)Meldungen in ein Logfile schreiben
18. Anstatt Write-Host -ForegroundColor Red wäre hier Write-Warning besser!
19. anstatt If ($? -eq $true) { … } kann man auch -ErrorAction Stop und einen Try{}Catch{} block benutzen.
Dann bricht das Script an der Stelle ab und wirft automatisch die richtige Fehlermeldung aus.
SIEHE AUCH
# Mit PowerShell 3.0 muss eventuell der -Online Parameter verwendet werden! Get-Help about_Functions_Advanced -Full # -Online Get-Help about_Functions_CmdletBindingAttribute -Full # -Online Get-Help about_Functions_ParameterAttributes –Full # -Online
Parameter Attribute:
Bild Quelle: PowerShell in Action, by Bruce Payette, Mannig Verlag (GELÖSCHT. siehe Kommentar unten.DR)
Script mit Änderungen (UNGETESTET!):
#requires -Version 3 Set-StrictMode -Version Latest <# .SYNOPSIS Change Password for AD User and Services where it is configured .DESCRIPTION Set-ServicePassword changes the Password for a AD User which is used in Services. The script first change the Password in AD, then connect to the remote Machine with a PSSession and changes the Service Startup Accounts Password .PARAMETER Computername One or more target Computername(s) or IP adresse(s) on those these command is supposed to work .PARAMETER ServiceUser Erklär, erklär, Bla blub.... .PARAMETER Password Erklär, erklär, Bla blub.... .EXAMPLE Set-ServicePassword -Computername Server1 -Service BITS -ServiceUser Testuser1 #> [CMDletBinding()] param ( [Parameter(Mandatory=$true,Position=0, ValueFromPipeline=$true, ValueFromPipelineByPropertyName=$true, HelpMessage="Enter a single or a List of Computername or IP!")] [Alias('hostname')] [String[]]$Computername, [Parameter(Mandatory=$true,Position=1, HelpMessage="Enter sAMAccountName for Service User!")] [string]$ServiceUser, [Parameter(Mandatory=$true,Position=2, ValueFromPipeline=$true, ValueFromPipelineByPropertyName=$true, HelpMessage="Enter new password to set for the service!")] [string]$Password ) $newPassword = $Password | ConvertTo-SecureString -AsPlainText -Force Write-Verbose "Ändere Passwort für den AD-User $serviceUser" Try{ Set-ADAccountPassword -Identity $serviceUser -NewPassword $($Password | ConvertTo-SecureString -AsPlainText -Force) -Reset -ErrorAction Stop } Catch { # Passwort Fehlermeldung ausgeben Write-Error $Error[0] # hier endet das Script bei einem Fehler mit dem Passwort! EXIT # exit ist eigentlich unnötig (ich bin paranoid ;-)) } $ProcessedComputers = @() foreach ($computer in $Computername) { If (Not ($ProcessedComputers -contains $Computername)) { $ProcessedComputers += $Computername Write-Verbose "Suche nach allen Diensten wo der Account $ServiceUser auf Computer: $Computer konfiguriert ist" # Hier eventuell erst den Zielcomputer anpingen! (Test-Connection) nur bei erfolg Invoke-Command ... Invoke-Command -ComputerName $computer -ArgumentList $ServiceUser,$Password -ScriptBlock -AsJob { Param ($serviceuser,$Password) $Dienst = Get-CimInstance -ClassName Win32_Service -Filter "StartName LIKE '$serviceUser%'" Write-Host "Folgende Dienste wurden gefunden: $($Dienst.Name)" If ($Dienst -ne $null) { ForEach ($svc in $Dienst) { Write-Host ".........." Write-host "Dienst $($svc.Name) wird bearbeitet!" Write-Host ".........." Write-Host "Ändere das Kennwort vom Dienst $($svc.Name) auf Computer: $env:COMPUTERNAME " -ForegroundColor Green $chpw = Invoke-CimMethod -InputObject $svc -MethodName Change -Arguments @{StartPassword = $Password} If ($chpw.ReturnValue -ne 0) { Write-Host "Fehler beim Ändern des Kennworts für den Dienst $($svc.Name) auf Computer: $env:COMPUTERNAME. Fehlercode $($chpw.Returnvalue)" -ForegroundColor Red } Write-Host "Dienst $($svc.Name) wird gestoppt" -ForegroundColor Green $stopsvc = Invoke-CimMethod -InputObject $svc -MethodName StopService If ($stopsvc.ReturnValue -ne 0) { Write-Host "Fehler beim Stoppen des Diensts $($svc.Name) auf dem Computer: $env:COMPUTERNAME. Fehlercode $($stopsvc.Returnvalue)" -ForegroundColor Red } Write-Host "Dienst $($svc.Name) wird gestartet" -ForegroundColor Green $startsvc = Invoke-CimMethod -InputObject $svc -MethodName StartService If ($startsvc.Returnvalue -ne 0) { Write-Host "Fehler beim Starten des Diensts $($svc.Name) auf dem Computer: $env:COMPUTERNAME. Fehlercode $($startsvc.Returnvalue)" -ForegroundColor Red } } } else { Write-Host "Es konnte kein Dienst auf Computer: $env:COMPUTERNAME mit dem Dienstkonsto $serviceuser gefunden werden!" -ForegroundColor Red } } } }
Please click “Mark as Answer” if my post answers your question and click “Vote As Helpful” if my Post helps you.
Bitte markiere hilfreiche Beiträge von mir als “Als Hilfreich bewerten” und Beiträge die deine Frage ganz oder teilweise beantwortet haben als “Als Antwort markieren”.
My PowerShell Blog http://www.admin-source.info
[string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
German ? Come to German PowerShell Forum!
- Bearbeitet Peter Kriegel Mittwoch, 9. Januar 2013 06:58
- Bearbeitet Denniver ReiningMVP, Moderator Freitag, 11. Januar 2013 16:51 Super Antwort Peter. Aber bitte keine Bilder oder längere Auzüge uherberrechtlich geschützer Werke (Bücher etc, generell alles was nicht explizit gemeinfrei ist) hier posten. Danke!
-
Also erstmal vielen Dank für deine Antwort. Ich finde es toll, wieviel Mühe du dir in allen deinen Antworten gibst!
Ich hoffe und denke auch mal, dass mir deine Antwort nicht alleine nützt, sondern viele hier rumlesen, denen solche Hilfen was bringt!
Ja, ich habe Powershell in Action. Das war mein erstes Buch, aber ab Seite 120 habe ich irgendwie das Gefühl bekommen, dass es noch! nicht das richtige für mich ist, da ich zuwenige Vorkenntnisse habe. Das Buch liest sich toll, aber viele Dinge habe ich gelesen, mir gedacht 'ok, hört sich super an', aber verstanden wie diese gemeint waren habe ich erst nach meinem zweiten Buch. Und zwar habe ich mir ab Seite 120 :) umgeschaut und mir dann 'Learn Powershell in a Month of Lunches' 2nd Edition geholt. Und ich muss sagen das Buch ist einfach unglaublich gut geschrieben und aufgebaut. Für mich als Anfänger das optimale Buch! Es fällt auch sehr schwer sich daran zu halten, nur 1 Kapitel am Tag zu lesen, obwohl ich glaube, dass die Autoren Recht haben, dass einen dies nicht weiter bringt, also mehr zu lesen, da das Hirn nur eine bestimmte Menge Infos vertragen kann.
Auf dem Stand bin ich im Prinzip. Das Buch fertig gelesen (bzw. mittlerweile bestimmt 2mal) und versuche mich nun mit solchen Beispielen wie oben an halbwegs sinnvolle Aufgaben heranzumachen um weiterzukommen. Das nächste Buch wird Toolmaking in a Month of Lunches sein und ich freu mich schon den Schreib- und Lehrstil der Autoren wieder genießen zu dürfen. Danach wollte ich mich dann nochmal an Powershell in Action machen.
Der Micrsoft Learning Online Kurs ist auch nicht schlecht.
Zu deinen Anmerkungen:
1) Ja, du hast Recht..war Faulheit.
2) Ok
3) Ok. Weiß auch nicht mehr, warum ich das PopUp Fenster wollte. Glaub damit ich den Fragetext selber vorgeben kann.
4) Ok, denke nach dem Toolmaking Buch würd ichs auch so machen ;-) Im ersten kamen die Parameter noch nicht vor ;-) Danke!
5) Verstanden
6) Siehe Antwort 4. Kannte ich bisher noch nicht. Danke!
7) Ok
8) Ja, einverstanden. Hab erst später gemerkt, dass ich auch ein Unsecure Brauchte und hab mich dann verwurschtelt denke ich
9) 10) 11) Ok, vestanden. Hatte noch ein Beispielt mit ParameterSets gefunden, aber nicht verstanden und deshalb nicht verwendet. Da wurde das Passwort dann, wenn es als Parameter übergeben wurde ans Skript als Unsecure angenommen und in Secure umgewandelt und wenn kein Passwort übergeben wurde, ein Secure Passwortabfrage gemacht.
12) ;-) Manchmal denke ich etwas umständlich
13) Ja, genau so Fehlerabfragen fehlen mir noch
14) Ja, hatte da wieder nen Knoten im Hirn und kannte die Methode um doppelte herauszufinden noch von VBScript. Das ich ein Session Objekt erst erzeuge, anstatt mit icm die Session on the fly aufzumachen war einerseits "Übung" um mit Session Objekten umzugehen und dann hatte ich in einer ersten Version mehrmals eine Session aufgebaut mit icm und da kam es mir wirtschaftlicher vor die Session offen zu halten
15) Ja, danke!!! Viel besser
16) Ja, mit dem CIMs ist auch Absicht..obwohl jeder schreibt die sind von der Syntax fast identisch zu benutzen wie die alten, waren doch einige Unterschiede. So konnte ich z.B. die Methode "Change()" nicht mit where-object $_.change() aufrufen..mit Get-Member wurde die bei dem Objekt auch nicht angezeigt wie noch mit dem get-wmiobject cmdlet. Ich wollte aber die CIM Cmdlets nutzen, da sie die Zukunft sind und bei uns die WSMAN Ports eher freigeschaltet sind wie RPC. Wenn ich die CIM cmdlets ohne icm benutze brauch ich diese(bzw. PS3) auch nur auf dem aufrufdenden Computer.
17) Ok. Fehlerbehandlung muss ich noch einiges lernen!
18) Ok. Hatte hier glaub Write-Host genommen, da ich sonst aus der ICM Session keine Ausgabe mit write-verbose bekommen hatte. Mal testen ob dies mit write-warning anders ist.
19) Super, danke! Benutzt man $? überhaupt oft? is bei mir eher aus dem NTShell Gedanken mit %errorlevel% gekommen
Also nochmal dickes Danke für deine Mühe! Hat mir sehr geholfen! :) Wäre doch witzig, wenn man sowas hier regelmäßig macht?! Ist sicher sehr informativ..oder noch besser :) Eine Skriptaufgabe pro Woche, jeder der Lust hat versucht sich und dann wird besprochen :) Aber ok, bei soviel Zeit wie du hier investierst, wird das sicher kaum noch handhabbar sein.
Das mit dem PS Modul ist auch ne super Idee. Vor allem mit PS3 wird das witzig..hatte letzens nochn Blogeintrag gelesen zu Mini Modulen mit PS3, da diese ja autom. nachgeladen werden.
Gruss
Bastian
- Bearbeitet baschuel Mittwoch, 9. Januar 2013 08:36
-
Danke für das Lob! Das tut gut!
Don Jones ist mein Vorbild und seine Bücher sind super!
Wegen der Bücher und meiner Meinung schau mal hier:
http://social.technet.microsoft.com/Forums/de-DE/powershell_de/thread/84727252-3d5d-459e-b3a8-73a15807a807
13. + 19.
Ob man $? In der PowerShell nutzt ist Geschmackssache. Es ist zumindest nicht weit verbreitet ;-)
Das Gleich gilt für Trap {}, da Trap{} meiner Meinung nach kompliziert und veraltet ist.
Alternativ sollte man für beides Try{},Catch{} oder Try{},Catch{},Finally{} nutzen.
16. >>> Wenn ich die CIM cmdlets ohne icm benutze brauch ich diese(bzw. PS3) auch nur auf dem aufrufdenden Computer.
Vorsicht das wird wahrscheinlich langsamer!
Jeder CIM Aufruf mit dem Parameter –Computername würde dann einen WinRM Session aufmachen Arbeiten und dann die Session wieder schließen! Denke ich…!
(WMI würde dasselbe über RPC machen, ist aber schneller, glaube ich!?)
Das Kapseln der CIMs in einem Invoke-Command ist deshalb sinnvoll, da dann nur eine Session gebraucht wird! Allerdings braucht dann jeder Ziel Computer PS 3.0!
Alternativ kann man mit New-PSSession eine Session aufmachen und diese in de CIMs verwenden. Das musst du ausprobieren! Da kenne ich mich nicht aus!
Man muss sich da entscheiden was man will. (man kann nur einen Tod sterben.Please click “Mark as Answer” if my post answers your question and click “Vote As Helpful” if my Post helps you.
Bitte markiere hilfreiche Beiträge von mir als “Als Hilfreich bewerten” und Beiträge die deine Frage ganz oder teilweise beantwortet haben als “Als Antwort markieren”.
My PowerShell Blog http://www.admin-source.info
[string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
German ? Come to German PowerShell Forum!