1. Einleitung
     
  2. Get-Help
    Beispiel 1: Inhalte der Onlinehilfe anhand von remove-item
    Beispiel 2: Erweiterte Anwendung von Get-help
    Beispiel 3: Erforderliche und optionale Parameter
    Beispiel 4: Aufruf der Onlinehilfe im Internet (Powershell V3.0)
     
  3. Get-Command
    Beispiel 1: Get-Command ohne Parameter
    Beispiel 2: Get-Command mit dem Parameter "-Parametername" (ab Powershell 3.0)
    Beispiel 3: Installierte Anwendungen anzeigen
    Beispiel 4: Pfad einer Anwendung auslesen
    Beispiel 5: die vollständigen Namen von cmdlets 
    Beispiel 6: die PS-Monster auf deinem Rechner
     
  4. Get-Member
    4.1 Get-Member ohne Parameter
          Beispiel: .Net Klasse, Default Methoden und eigenschaften des cmdlets " get-date" bestimmen 
          Beispiel: Erforschen eines Skript-Objects mit get-member 
    4.2 Get-Member mit dem Parameter -static     
          Beispiel: Ermitteln der statischen Eigenschaften und Methoden von get-date bzw. [system.datetime]
          Beispiele: statische Eigenschaften von [system.datetime]  
    4.3 Get-Member mit dem Parameter –force (intrinsic parameter)      
          Beispiel: compilergenerierte Methoden get_date()
          Beispiel: Anzeigen der vier Intrinsic-Parameter (psadapted, psbase, psextended, psobject)
          BeispielVergleich der Methoden und Objekte von get-process mit PSBASE und ohne PSBASE
          BeispielVergleich der Methoden und Objekte der WMI-Klasse 'win32_operatingsystem' mit PSBASE und ohne PSBASE
          Beispiel: Ausgabe einer Beschreibung zur wmi-Klasse 'win32_operatingsystem' 
          Beispiel Eigenschaften eines AD-Users auslesen
          Beispiel: Eigenschaften eines AD-Users setzen

1 Einleitung

Powershell bringt eine umfangreiche Hilfe mit. Wie so oft besteht die Schwierigkeit im Finden und Ausnutzen der vorliegenden Informationen.

Für die Orientierung in der Powershell gibt es jedoch 3 cmdlets, die man immer parat haben sollte.

  • get-help
  • get-command
  • get-member 

Diese 3 Befehle bilden die Grundausrüstung im Werkzeugkasten zum erfolgreichen Nutzen der Powershell. Den Einsatz zeigen die nächsten drei Kapitel

2 Get-Help

Get-Help liefert die Befehlssyntax und Beispiele für jedes PowershellCommand

Beispiel 1: Nutzen der Onlinehilfe anhand von Remove-Item 

#Kurzbeschreibung von "Remove-Item"

Get-Help Remove-Item

#Detailbeschreibung und Beispiele von "Remove-Item"

Get-Help Remove-Item –Detailed

#Beispiele von "Remove-Item"

Get-Help Remove-Item –Examples

#Detaillierteste Beschreibung von "Remove-Item"

Get-Help Remove-Item –Full

#alle Commandos, die "Remove" enthalten

Get-help *Remove*

Die Flags müssen nicht ausgeschrieben werden. Es genügt ein –D zu schreiben und die Tabulatortaste zu drücken. Powershell füllt den Parameter dann zu –Detailed auf.


Beispiel 2: Erweiterte Anwendung von Get-Help

#Hilfe zur Hilfe

Get-Help Get-Help

#Überblick über alle Powershell Commandos mit Kurzbeschreibung (Synopsis)

Get-Help *

#Anzeigen aller cmdlets sortiert nach dem Namen

Get-Help * | Where{$_.Category -eq "cmdlet"} | Sort Name

#Get-Help * | Where Category -eq "cmdlet" | Sort Name #Powershell V3.0

#Anzeigen aller Aliasse sortiert nach dem Namen, Ausgabe als formatierte Tabelle mit Autoformat

Get-Help * | Where{$_.Category -eq "Alias"} | Sort Name | Format-Table -auto

Get-Help * | Where Category -eq "Alias" | Sort Name | Format-Table -auto #Powershell V3.0

#Anzeigen der konzeptionellen Hilfen

Get-Help about*

#übersichtlichere Anzeige der konzeptionellen Hilfen, Ausgabe als formatierte Tabelle mit Autoformat

Get-Help about_ | Select Name,Aynopsis | Format-Table -auto

# kann man als Function auch ins Profile schreiben (siehe Kapitel über Profile)

In den konzeptionellen Hilfen findet man ausführliche Informationen über zahlreiche Themen. Sollten diese Hilfeartikel nicht aufrufbar sein, dann im Powershell Installationsverzeichnis C:\WINDOWS\system32\WindowsPowerShell\v1.0 das Unterverzeichnis "en-US" kopieren und die Verzeichniskopie in "de-DE" umbenennen.

Da man kaum eine Powershell Session ohne mehrfaches Aufrufen dieses Befehls beendet, habe ich in meinem Profil profile.ps1 das Alias gh für get-help definiert:

Set-Alias -Name gh -Value Get-Help

vergleiche Kapitel My Powershell -> 3.3.1.2 Beispiele für Profile -> Beispiel 2 
 

Beispiel 3: Erforderliche und optionale Parameter

Die cmdlets der Powershell besitzen meist eine recht große Anzahl an Parametern, die Get-Help in der Syntax anzeigt. Es gibt einige wenige erforderliche Parameter und mehrere optionale Parameter. In der Ausgabe von Get-Help erkennt man die optionalen Parameter an den eckigen Klammern, in die diese eingeschlossen sind

Get-Help Copy-Item

#Ausgabe gekürzt

SYNTAX
    Copy-Item [-LiteralPath] <string[]> [[-Destination] <string>] [-Container] [-Credential <PSCredential>]

    [-Exclude <string[]>] [-Filter <string>] [-Force] [-Include <string[]>] [-PassThru] [-Recurse]

    [Confirm] [-WhatIf] [-UseTransaction] [<CommonParameters>]

Erforderlich ist in diesem Beispiel nur der string für den Parameter "-Literalpath". Wobei der Parametername "-LiteralPath" ebenfalls optional ist. -LiteralPath ist der Defaultparameter

Mittlerweile, nachdem ich dieses Kapitel ursprünglich vor etwa zwei Jahren geschrieben habe, nutze ich heute vermehrt die Onlinehilfe in der Technet. Dazu googelt man einfach nach dem Namen des cmdlets + Technet + powershell und bekommt die Technetlinks auf den Hilfetext in deutsch oder englisch unter den ersten 5 Treffern angezeigt. 
Get-Help liefert unter der Rubrik "Verwandte Links" ebenfalls den Link zu Technet.
Im Browser lassen sich Hilfetexte nach meinem Geschmack einfacher lesen, als im Powershellfenster. Die online Texte sind entweder identisch oder aktueller als in der lokalen Powershellhilfe.
Zur Suche der passenden Hilfetexte sind die oben vorgestellten Befehle aber weiterhin wertvoll.

Ab der Powershellversion 3.0 kann oder besser muß man die lokale Hilfe mittels des cmdlets "Update-Help" vor der ersten Benutzung vom Internet auf seinen lokalen Client herunterladen. Dafür kann man mit diesem Update die lokale Hilfe immer wieder auf den aktuellen Stand bringen.

Beispiel 4: Aufruf der Onlinehilfe im Internet (Powershell V3.0)

Get-Help Copy-Item -Online

gelangt man aus der Powershell direkt in die Technet, sofern der Rechner ins Internet kommt

3 Get-Command

Technet: Get-Command

Mit Get-Command kann man einerseits nach cmdlets für eine bestimmte Aufgabe suchen, aber auch interessante Informationen über cmdlets auslesen

Beispiel 1: Suchen nach passenden Cmdlets

Es sollen Cmdlets herausgefiltert werden, mit denen Prozesse verwaltet werden können

Get-Command –Commandtype cmdlet *process* | Format-Table Name -Auto

#Ausgabe

Name         
----         
Debug-Process
Get-Process  
Start-Process
Stop-Process 
Wait-Process

 
Beispiel 2: Get-Command mit dem Parameter "-Parametername" (ab Powershell 3.0)

Das cmdlet "Get-Command" hat in der Powershell 3.0 den neuen Positionsparameter -Parametername bekommen, mit dem sich cmdlets nach bestimmten Parametern filtern lassen

#Powershell V3.0

Get-Command -ParameterName Computername

#Ausgabe gekürzt

CommandType     Name 
-----------     ----
Cmdlet          Add-Computer
Cmdlet          Clear-EventLog
Cmdlet          Connect-PSSession

Dadurch lassen sich die Cmdlets herausfinden, mit denen sich besonders einfach Remotemaschinen verwalten lassen.

Auf einem nativen Windows7-System mit Powershell V3 (PreRelease) sind das immerhin schon 42 cmdlets

#Powershell V3.0 auf Windows7

(Get-Command -ParameterName Computername).Count

#Ausgabe

42


Beispiel 3: Installierte Anwendungen anzeigen

Interessant, wenn auch unübersichtlich ist der Output von "Get-Command *" . Hier werden zusätzlich alle installierten Anwendungen angezeigt, die in der Powershell direkt aufrufbar sind.

Je nach Geschmack kann man mit diesen Informationen neue Aliase ins Profil setzen 

#Setzen eines Aliases auf ein installiertes Programm
Set-Alias –Name np –Value notepad.exe
Set-Alias –Name re –Value regedit.exe
sal ex -Value "C:\Programme\Office PE\OFFICE11\EXCEL.EXE"

 

Beispiel 4: Pfad einer Anwendung auslesen

#Powershell 2.0

Get-Command ipconfig

#Ausgabe

CommandType                  Name                    Definition
-----------                  ----                    ----------
Application                 ipconfig.exe             C:\Windows\system32\ipconfig.exe

alternativ kann man das WindowsCommandlinetool "where.exe" benutzen


Beispiel 5: die vollständigen Namen von cmdlets 

Wir verwenden im alltäglichen Powershelleben genaugenommen nur eine Kurzform des cmdlets. Get-Command zeigt uns den vollständigen Namen

#Powershell 2.0

(Get-Command Get-Acl).ModuleName
(Get-Command Get-Host).ModuleName

#Ausgabe

Microsoft.PowerShell.Security
Microsoft.PowerShell.Utility


Der vollständige Aufruf des cmdlets Get-Acl lautet mit der Angabe des Moduls

Microsoft.PowerShell.Security\Get-Acl 

was erwartungsgemäß gleichbedeutend ist mit 

Get-Acl 

Gute Entwickler versehen cmdlets aus selbstgeschriebenen Modulen mit eindeutigen Prefixes, um keine Namenskollisionen durch cmdlets aus unterschiedlichen Modulen zu bekommen. 

 

Beispiel 6: die PS-Monster auf deinem Rechner

Clear-Host
 
Get-command | Select Name, @{Name='NameLength';expression={$_.Name.Length}} `
            | Sort-Object -Descending NameLength | Select -first 5 | Format-Table -auto

#mögliche Ausgabe

 

Name                                                 NameLength
----                                                 ----------
Get-ADDomainControllerPasswordReplicationPolicyUsage         52
Remove-ADDomainControllerPasswordReplicationPolicy           50
Get-ADAccountResultantPasswordReplicationPolicy              47
Get-ADDomainControllerPasswordReplicationPolicy              47
Add-ADDomainControllerPasswordReplicationPolicy              47

 

4 Get-Member

Technet: Get-Member

Get-Member ist von den hier behandelten drei cmdlets wahrscheinlich am Anfang das Schwierigste zu verstehen.

Der Umgang mit Get-Member ist dennoch Voraussetzung, um die Mächtigkeit von Powershell ausnutzen zu können. Ohne das Verständnis von Get-Member wird man bei jeder neuen Aufgabe im Internet nach einem fertigen Skript suchen müssen, das die eigenen Anforderungen zu mindestens 80% erfüllt und welches man dann marginal weiter anzupassen versucht.

Syntax: Im Gegensatz zu Get-Help und Get-Command wird Get-Member hinter einer Pipe des zu untersuchenden Objekts oft mit weiteren Parametern angewendet. (siehe Beispiele weiter unten)
 

4.1 Get-Member ohne Parameter

Der Aufruf von Get-Member ohne Parameter liefert alle default Methoden und Eigenschaften eines cmdlets oder Objekts.

Default sind alle Powershell-Eigenschaften und Methoden dieses cmdlets außer den statischen Eigenschaften und den intrinsic Parametern. Die Default Werte basieren natürlich auf der zugehörigen .Net Klasse, können aber auch mehr oder weniger als diese enthalten.

Beispiel 1: .Net Klasse, Default Methoden und Eigenschaften des cmdlets " Get-Date" bestimmen

Senden von "Get-Date" nach "Get-Member" ohne Parameter

#Powershell V2.0

Get-Date | Get-Member

#Ausgabe gekürzt

        TypeName: System.DateTime

ToLongTimeString     Method         string ToLongTimeString()
ToString             Method         string ToString(), string ToString(string format), string ToString(System.IForma...
ToUniversalTime      Method         System.DateTime ToUniversalTime()
DisplayHint          NoteProperty   Microsoft.PowerShell.Commands.
Date                 Property       System.DateTime Date {get;}
Year                 Property       System.Int32 Year {get;}

DisplayHint (NoteProperty) und Datetime(ScriptProperty) sind keine Eigenschaften der DotNet-Klasse [System.DateTime], sondern von den cmdlet Entwicklern hinzugefügt worden. Den unverfälschten Blick auf die .Net Klasse erhält man mit psbase  oder mit dem Objectbrowser aus VisualStudio 
Die hinter Get-Date liegende .Net-Klasse lautet [System.DateTime], was man uas der Zeile  "TypeName: System.DateTime" mherauslesen kann

daraus kann man folgende Befehle ableiten

#Powershell V2.0

(Get-Date).Date #<-Property
(Get-Date).ToLongTimeString() #<-Methoden mit ()

#Ausgabe

Donnerstag, 4. März 2010 00:00:00
12:33:02


Beispiel 2: Erforschen eines String-Objects mit Get-Member 

#Powershell V2.0

$String = "Mein Freund Karl Napf
$String | Get-Member

#Ausgabe gekürzt

   TypeName: System.String

Name             MemberType            Definition
----             ----------            ----------
Replace          Method                string Replace(char oldChar, char newChar), string Replace(string oldValue, s.
Substring        Method                string Substring(int startIndex), string Substring(int startIndex, int length)
ToCharArray      Method                char[] ToCharArray(), char[] ToCharArray(int startIndex, int length)
ToLower          Method                string ToLower(), string ToLower(System.Globalization.CultureInfo culture)
ToLowerInvariant Method                string ToLowerInvariant()
ToString         Method                string ToString(), string ToString(System.IFormatProvider provider)

daraus kann man folgende Befehle ableiten


$String.ToLower()
$String.Replace("N","Kl") #<-sieh auch Kapitel über String- und Textdateianalyse

#Ausgabe

mein freund karl napf
Mein Freund Karl Klapf

 

4.2 get-member mit dem Parameter -static

Default Methoden und Eigenschaften können nur auf eine Instanz der Klasse angewendet werden, nicht auf die Klasse ansich. Statische Methoden und Eigenschaften dagegen werden auf die ganze Klasse angewendet, nicht auf eine Instanz. 

Am besten wird der Unterschied zwischen statischen und nicht statischen Eigenschaften und Methoden durch einige Beispiele (.NET) hoffentlich deutlich:

Die Klasse [System.Datetime]  und das zugehörige Cmdlet "Get-Date" haben folgende statische Werte
(Ich konnte keinen Weg finden, statische Methoden direkt auf Get-Date anwenden zu können)

Beispiel 1: Ermitteln der statischen Eigenschaften und Methoden von Get-Date bzw. [System.Datetime]

[System.Datetime] |Get-Member -Static

#gekürzte Ausgabe
IsLeapYear      Method     static System.Boolean IsLeapYear(Int32 year)
MaxValue        Property   static System.DateTime MaxValue {get;}
MinValue        Property   static System.DateTime MinValue {get;}
Now             Property   System.DateTime Now {get;}
Parse           Method     static System.DateTime Pa
Today           Property   System.DateTime Today {get;}

Damit lassen sich in Beispiel 2 mehrere statische Informationen programmtechnisch aus dieser Klasse abfragen, ohne dass es eine Rolle spielt, welche Zeit tatsächlich auf dem System herrscht oder in welcher Zeitzone der Rechner steht.

Beispiele 2: statische Eigenschaften und Methoden von [system.datetime] 

Bestimmen, ob 2009 ein Schaltjahr ist 

[System.Datetime]::IsLeapYear(2009)

#Ausgabe

False

 
Bestimmen des höchsten Datums, mit dem die Klasse System.DateTime umgehen kann

[System.DateTime]::Maxvalue

#Ausgabe

Freitag, 31. Dezember 9999 23:59:59

 
Aktuelles Datum/ Uhrzeit

[system.datetime]::Now

#Ausgabe

Dienstag, 7. April 2009 17:03:37

 
Umwandeln eines Strings in ein DateTime-Object

[System.DateTime]::Parse("März 07, 2009 13:15:22")

#Ausgabe
Samstag, 7. März 2009 13:15:22

Parse ist eine statische Methode


Beispiel 3: statische Eigenschaften und Methoden von Get-Process

Auf Prozesse gehe ich im Kapitel Prozesse noch näher ein
Get-Process liefert alle Processe auf dem aktuellen Computer. Eine statische Methode von Get-Process ist zum Beispiel "Start" zum Starten eines weiteren Processes 

Get-Process | Get-Member -Static

#gekürzte Ausgabe

   TypeName: System.Diagnostics.Process

Name               MemberType Definition
----               ---------- ----------

EnterDebugMode     Method     static System.Void EnterDebugMode()
...
ReferenceEquals    Method     static bool ReferenceEquals(System.Object objA, System.Object objB)
Start              Method     static System.Diagnostics.Process Start(string fileName, string userName,...

 

Starten eines weiteren Processes (NotePad.exe)

[System.Diagnostics.Process]::Start("Notepad") #statische Methode

#Ausgabe
Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
-------  ------    -----      ----- -----   ------     -- -----------
     10       1      612       1360    19     0,00     1788 notepad

 

Untersuchen des eben gestarteten Prozesses mit der ID 1788

(Get-Process -id 1788).Starttime #nicht statisch, da instanzbezogen

#Ausgabe

Samstag, 2. Mai 2009 00:22:37


Starten eines weiteren Processes unter anderen Credentials

$Logon = Get-Credential #Credentials müssen eingegeben werden
[System.Diagnostics.Process]::Start("cmd.exe",$Logon.Username,$Logon.Password,"myMachine")

 

4.3 get-member mit dem Parameter –force (intrinsic parameter)

Der Parameter –Force liefert neben den Default Methoden und Eigenschaften zusätzlich die sogenannten intrinsic Parameter (Membertype = Memberset) und die vom Compiler generierten get_ und set_ Methoden.  Die compilergenerierten Methoden liefern dieselben Werte, wie die Default Eigenschaften des cmdlets zurück und sind daher meiner Meinung nach redundant, weswegen ich außer dem folgenden Beispiel nicht weiter darauf eingehen werde

Beispiel 1: compilergenerierte Methoden get_date()

(Get-Date).Get_Date()

#ist gleichwertig zu

(Get-Date).Date

#mögliche Ausgabe

 

Samstag, 11. April 2009 00:00:00

 

Beispiel 2: Anzeigen der vier Intrinsic-Parameter (psadapted, psbase, psextended, psobject)

Get-Service | Get-Member –force

#gekürzte Ausgabe
   TypeName: System.ServiceProcess.ServiceController

Name                      MemberType    Definition
---                      ----------    ----------
Name                      AliasProperty Name = ServiceName
Disposed                  Event         System.EventHandler Disposed(System.Object, System.EventArgs)
psadapted                 MemberSet     psadapted {CanPauseAndContinue, CanShutdown, CanStop,...
psbase                    MemberSet     psbase {CanPauseAndContinue, CanShutdown, CanStop,...
psextended                MemberSet     psextended {Name, RequiredServices}
psobject                  MemberSet     psobject {Members, Properties, Methods, ImmediateBaseObject...
PSStandardMembers         MemberSet     PSStandardMembers {DefaultDisplayPropertySet}

 

Definition Intrinsic-Parameter:
 
Windows PowerShell Blog:
What's up with PSBASE, PSEXTENDED, PSADAPTED, and PSOBJECT?

Technet: Get-Member

-- PsBase: The original properties of the .NET object without extension or adaptation. These are the properties defined for the object class and listed in MSDN.

-- PsAdapted: The properties and methods defined in the Windows PowerShell extended type system.

-- PsExtended: The properties and methods that were added in the Types.ps1xml files or by using the Technet: Add-Member cmdlet.

-- PsObject: The adapter that converts the base object to a Windows PowerShell PsObject. -- PSTypeNames: A list of object types that describe the object, in order of specificity. When formatting the object, Windows PowerShell searches for the types in the Format.ps1xml files in the Windows PowerShell installation directory ($pshome). It uses the formatting definition for the first type that it finds.

PSBASE

the raw view of the object

PSADAPTED

the fully adapted view of the object

PSEXTENDED

just the extended elements of the object

PSOBJECT

a view of the adapter itself 

Wie in vielen Produkten möchte Microsoft uns Anwendern das Leben erleichtern durch das Filtern unnötiger Informationen und dem Hinzufügen zusätzlicher Funktionen. Die Powershell beruht auf dem oft sehr umfangreichen .Net-Framework. Klassen, Methoden und Eigenschaften bezieht die Powershell aus diesem Pool.

Viele wichtige Methoden und Eigenschaften beispielsweise von AD-Objekten wie das "disablen / enablen" oder die Eigenschaft "TerminalserviceProfile" von AD-Usern sind nicht in der .Net Klasse enthalten, sondern sind nur ersichtlich, wenn man mittels psbase auf das Activedirectory direkt zugreift. Aufgerufen werden diese Methoden und Eigenschaften mit $user.psbase.invokeget("TerminalserviceProfile") anstelle von $user.homedirectory. Mehr dazu ist im Kapitel ActiveDirectory beschrieben.

Psbase ist damit der wichtigste Intrinsic-Parameter. Die drei übrigen Parameter liefern gegenüber einem Get-Member ohne Parameter bzw. dem psbase keine neuen Informationen, sondern filtern diese Informationen im Bezug auf das .Net Framework

Kürzer ausgedrückt, bieten die vier intrinsic Parameter vier verschiedene Sichtweisen auf eine Klasse an, wobei sich die Ergebnisse der Sichtweisen oft nicht unterscheiden

Am besten lässt sich der Einsatz des PSBASE-Parameters wieder an Beispielen zeigen:

Beispiel 3: Vergleich der Methoden und Objekte von Get-Process mit PSBASE und ohne PSBASE

Mit psbase

notepad #Instanz von notepad starten
$a=Get-Process notepad
$a.psbase | Get-Member  #liefert den reinen Blick auf die .Net Klasse

#gekürzte Ausgabe

   TypeName: System.Management.Automation.PSMemberSet

Name                       MemberType Definition
----                       ---------- ----------

Disposed                   Event      System.EventHandler Disposed(Sys
ErrorDataReceived          Event      System.Diagnostics.DataReceivedE
Exited                     Event      System.EventHandler Exited(Syste
OutputDataReceived         Event      System.Diagnostics.DataReceivedE
BeginErrorReadLine         Method     System.Void BeginErrorReadLine()…


ohne psbase

notepad #Instanz von notepad starten
$a=get-process notepad
$a | Get-Member # liefert einen veränderten Blick durch die "Powershell-Brille"

#gekürzte Ausgabe

   TypeName: System.Diagnostics.Process

Name                       MemberType     Definition
----                       ----------     ----------

Handles                    AliasProperty  Handles = Handlecount
Name                       AliasProperty  Name = ProcessName
NPM                        AliasProperty  NPM = NonpagedSystemMemorySize
PM                         AliasProperty  PM = PagedMemorySize
VM                         AliasProperty  VM = VirtualMemorySize
WS                         AliasProperty  WS = WorkingSet
Disposed                   Event          System.EventHandler

 

Interessant ist die Ausgabe aller Basiseigenschaften mit Werten durch diesen Aufruf

#Skript

notepad #Instanz von notepad starten
$a=Get-Process notepad
$a.psbase

#Ausgabe

BasePriority               : 8
ExitCode                   :
HasExited                  : False
ExitTime                   :
Handle                     : 1288
HandleCount                : 60
Id                         : 2480
MachineName                : .
MainWindowHandle           : 1180642
MainWindowTitle            : Untitled - Notepad


Beispiel 4: Vergleich der Methoden und Objekte der WMI-Klasse 'Win32_OperatingSystem' mit PSBASE und ohne PSBASE

mit psbase

$c = GWmi -query " Select * from meta_class where __class='win32_operatingsystem'"
$c.psbase | Get-Member # purer, unverstellter Blick auf das WMI-Object

#Ausgabe gekürzt

Item                      ParameterizedProperty System.Object Item(string propertyName) {g
ClassPath                 Property              System.Management.ManagementPath ClassPath
Container                 Property              System.ComponentModel.IContainer Container
Derivation                Property              System.Collections.Specialized.StringColle
Methods                   Property              System.Management.MethodDataCollection Met
Options                   Property              System.Management.ObjectGetOptions Options
Path                      Property              System.Management.ManagementPath Path {get
Properties                Property              System.Management.PropertyDataCollection P
Qualifiers                Property              System.Management.QualifierDataCollection
Scope                     Property              System.Management.ManagementScope Scope {g
Site                      Property              System.ComponentModel.ISite Site {get;set;
SystemProperties          Property              System.Management.PropertyDataCollection S

 

ohne psbase

$c = GWmi -query " Select * from meta_class where __class='win32_operatingsystem'"
$c | Get-Member   #Powershellbrille

#Ausgabe gekürzt

TypeName: System.Management.ManagementClass#ROOT\cimv2\Win32_OperatingSystem

Name                MemberType    Definition
----                ----------    ----------
Name                AliasProperty Name = __Class
__SUPERCLASS        Property      System.String __SUPERCLASS
ConvertFromDateTime ScriptMethod  System.Object ConvertFromD
ConvertToDateTime   ScriptMethod  System.Object ConvertToDat

Wie man sieht, unterschlägt hier die Powershell-Brille viele, möglicherweise nützliche Eigenschaften und Methoden der WMI-Klasse.

Als konkretes Beispiel habe ich unter http://blogs.msdn.com/wmi/ Windows Management Infrastructure Blog: Searching for WMI classes gefunden, das die Beschreibung der wmi-Klasse abfrägt.

Beispiel: Ausgabe einer Beschreibung zur wmi-Klasse 'win32_operatingsystem'

$c = GWmi -query " Select * from meta_class where ` __class='Win32_Operatingsystem'" –amended
$c.psbase.Qualifiers["Description"].Value

#Ausgabe

Die Klasse "Win32_OperatingSystem" stellt ein auf einem Win32-Computersystem installiertes Betriebssystem dar. Jedes Betriebssystem, das auf einem Win32-System installiert werden kann, ist ein Mitglied dieser Klasse.
Beispiel: Microsoft Windows 95.

Der Parameter '-amended' holt zusätzliche Informationen, wie die " localizable information"


Beispiel: Eigenschaften eines AD-Users auslesen

Im folgenden soll das User Object  "CN=Karl Napf,OU=powershelltest,DC=dom1,DC=de" der Übrsichtlichkeit halber bereits existieren. Zum Nachvollziehen des Beispiels kann man sich natürlich einen beliebigen AD-User anlegen.

  • Example 1: <UserObject>.properties
  • Example 2: <UserObject>.psbase
  • Example 3: <UserObject>.psbase.properties
  • Example 4: <UserObject> | get-member
  •  

Example 1

$Username = "CN=Karl Napf,OU=powershelltest,DC=dom1,DC=de"  
$User = [ADSI]"LDAP://$Username"
$User.Properties

#Ausgabe

PropertyName                  Value
------------                  -----
objectClass                   {top, person, organization...
cn                            Karl Napf
sn                            Napf
givenName                     Karl
distinguishedName             CN=Karl Napf,OU=powershell...
instanceType                  4
whenCreated                   17.04.2009 15:32:39
whenChanged                   17.04.2009 15:33:45
displayName                   Karl Napf
uSNCreated                    System.__ComObject
memberOf                      CN=Administrators,CN=Built...
uSNChanged                    System.__ComObject
name                          Karl Napf
objectGUID                    {44, 33, 162, 38...}
userAccountControl            66048
badPwdCount                   0
codePage                      0
countryCode                   0
badPasswordTime               System.__ComObject
lastLogoff                    System.__ComObject
lastLogon                     System.__ComObject
pwdLastSet                    System.__ComObject
primaryGroupID                513
objectSid                     {1, 5, 0, 0...}
accountExpires                System.__ComObject
logonCount                    1
sAMAccountName                KarlNapf
sAMAccountType                805306368
userPrincipalName             KarlNapf@dom1.de
objectCategory                CN=Person,CN=Schema,CN=Con...
lastLogonTimestamp            System.__ComObject
nTSecurityDescriptor          System.__ComObject

Die Werte hinter System.__ComObject sind vom Typ LargeInteger. Wie man an deren Inhalt herankommt, habe ich unter COM -> 2 System.__ComObject beschrieben


Example 2

$Username = "CN=Karl Napf,OU=powershelltest,DC=dom1,DC=de" 
$User = [ADSI]"LDAP://$Username"
$User.PsBase

#Ausgabe

AuthenticationType : Secure
Children           : {}
Guid               : 26a2212c-21d5-4c0f-8b0b-59697e866d98
ObjectSecurity     : System.DirectoryServices.ActiveDirectorySecurity
Name               : CN=Karl Napf
NativeGuid         : 2c21a226d5210f4c8b0b59697e866d98
NativeObject       : System.__ComObject
Parent             : System.DirectoryServices.DirectoryEntry
Password           :
Path               : LDAP://CN=Karl Napf,OU=powershelltest,DC=dom1,DC=de
Properties         : {objectClass, cn, sn, givenName...}
SchemaClassName    : user
SchemaEntry        : System.DirectoryServices.DirectoryEntry
UsePropertyCache   : True
Username           :
Options            : System.DirectoryServices.DirectoryEntryConfiguration
Site               :
Container 

 

#Example 3

$UserName = "CN=Karl Napf,OU=powershelltest,DC=dom1,DC=de" 
$User = [ADSI]"LDAP://$UserName"
$User.PsBase.Properties


#Ausgabe
PropertyName                  Value
------------                  -----
objectClass                   {top, person, organization...
cn                            Karl Napf
sn                            Napf
givenName                     Karl
distinguishedName             CN=Karl Napf,OU=powershell...
instanceType                  4
whenCreated                   17.04.2009 15:32:39
whenChanged                   17.04.2009 15:33:45
displayName                   Karl Napf
uSNCreated                    System.__ComObject
memberOf                      CN=Administrators,CN=Built...
uSNChanged                    System.__ComObject
name                          Karl Napf
objectGUID                    {44, 33, 162, 38...}
userAccountControl            66048
badPwdCount                   0
codePage                      0
countryCode                   0
badPasswordTime               System.__ComObject
lastLogoff                    System.__ComObject
lastLogon                     System.__ComObject
pwdLastSet                    System.__ComObject
primaryGroupID                513
objectSid                     {1, 5, 0, 0...}
accountExpires                System.__ComObject
logonCount                    1
sAMAccountName                KarlNapf
sAMAccountType                805306368
userPrincipalName             KarlNapf@dom1.de
objectCategory                CN=Person,CN=Schema,CN=Con...
lastLogonTimestamp            System.__ComObject
nTSecurityDescriptor          System.__ComObject

Die Werte hinter System.__ComObject sind vom Typ LargeInteger. Wie man an deren Inhalt herankommt, habe ich unter COM -> 2 System.__ComObject beschrieben


Example 4

$UserName = "CN=Karl Napf,OU=powershelltest,DC=dom1,DC=de" 
$User = [ADSI]"LDAP://$username"
$User | Get-Member


#Ausgabe

   TypeName: System.DirectoryServices.DirectoryEntry

Name                        MemberType Definition
----                        ---------- ----------
ConvertDNWithBinaryToString CodeMethod static System.String Conv
ConvertLargeIntegerToInt64  CodeMethod static System.Int64 Conve
accountExpires              Property   System.DirectoryServices.
badPasswordTime             Property   System.DirectoryServices.
badPwdCount                 Property   System.DirectoryServices.
cn                          Property   System.DirectoryServices.
codePage                    Property   System.DirectoryServices.
countryCode                 Property   System.DirectoryServices.
displayName                 Property   System.DirectoryServices.
distinguishedName           Property   System.DirectoryServices.
givenName                   Property   System.DirectoryServices.
instanceType                Property   System.DirectoryServices.
lastLogoff                  Property   System.DirectoryServices.
lastLogon                   Property   System.DirectoryServices.
lastLogonTimestamp          Property   System.DirectoryServices.
logonCount                  Property   System.DirectoryServices.
memberOf                    Property   System.DirectoryServices.
name                        Property   System.DirectoryServices.
nTSecurityDescriptor        Property   System.DirectoryServices.
objectCategory              Property   System.DirectoryServices.
objectClass                 Property   System.DirectoryServices.
objectGUID                  Property   System.DirectoryServices.
objectSid                   Property   System.DirectoryServices.
primaryGroupID              Property   System.DirectoryServices.
pwdLastSet                  Property   System.DirectoryServices.
sAMAccountName              Property   System.DirectoryServices.
sAMAccountType              Property   System.DirectoryServices.
sn                          Property   System.DirectoryServices.
userAccountControl          Property   System.DirectoryServices.
userPrincipalName           Property   System.DirectoryServices.
uSNChanged                  Property   System.DirectoryServices.
uSNCreated                  Property   System.DirectoryServices.
whenChanged                 Property   System.DirectoryServices.
whenCreated                 Property   System.DirectoryServices.

Die Erkenntnis aus diesem Beispiel aus dem AD lautet, dass man bei der Suche nach Eigenschaften das Anzeigen der intrinsic-Eigenschaften mit psbase einbeziehen sollte.

So bekommt man die GUID oder die NativeGUID des Users "Karl Napf" nur über psbase angezeigt.
 

Beispiele: Eigenschaften eines AD-Users setzen

(mehr dazu im Kapitel ActiveDirectory)

Einige wichtige Eigenschaften des NativeObjects lassen sich nur über psbase setzen und liefern mit dem Standardmethode "Put" einen Fehler bei setinfo(), andere lassen sich über beide Methoden setzen

Eigenschaft "Description" setzen mit der Put-Methode:

$UserName = "CN=Karl Napf,OU=powershelltest,DC=dom1,DC=de
$User=[ADSI]"LDAP://$username"

#Setzen der Eigenschaft "Description" mit Put
$User.Put("Description","my good old friend Karl")
$User.SetInfo()

$User.Description

#Ausgabe

my good old friend Karl

 

Eigenschaft "Description" setzen mit der Invokeset-Methode:

$UserName = "CN=Karl Napf,OU=powershelltest,DC=dom1,DC=de
$User = [ADSI]"LDAP://$UserName"

#Setzen der Eigenschaft "Description" mit psbase
$User.PsBase.InvokeSet("Description","my very good old friend Karl")
$User.SetInfo()
$User = [ADSI]"LDAP://$username" #Neueinlesen des Users

$User.Description

#Ausgabe

my very good old friend Karl

 

Aktivieren eines Userkontos

$UserName = "CN=Karl Napf,OU=powershelltest,DC=dom1,DC=de
$User = [ADSI]LDAP://$username

#enablen des Accounts ist nur über psbase möglich
$User.PsBase.InvokeSet("accountdisabled","false")
$User.SetInfo()

$User.AccountDisabled

#mögliche Ausgabe

False  #d.h. user ist enabled

 

noch viele weitere Beispiele für die Userverwaltung im ActiveDirectory gibt es unter:

Directories und Datenbanken -> AD  und .Net -> User