Behandelte Themen

  1. Einleitung

  2. Get-Help
    Beispiele: Inhalte der Onlinehilfe anhand von remove-item
    Beispiele: Erweiterte Anwendung von Get-help

  3. Get-Command

  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)
          Beispiel: Vergleich der Methoden und Objekte von get-process mit PSBASE und ohne PSBASE
          Beispiel: Vergleich 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 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


Beispiele: Inhalte 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.


Beispiele: 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 * |?{$_.category -eq "cmdlet"}  |sort name

#Anzeigen aller Aliasse sortiert nach dem Namen, Ausgabe als formatierte Tabelle mit Autoformat
get-help * |?{$_.category -eq "Alias"}|sort name |format-table -auto

#Anzeigen der konzeptionellen Hilfen
get-help about*

#übersichtlichere Anzeige der konzeptionellen Hilfen, Ausgabe als formatierte Tabelle mit Autoformat
get-help about_ |select name,synopsis | 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

Mittlerweile, nachdem ich dieses Kapitel ursprünglich vor etwa zwei Jahren geschrieben habe, nutze ich heute vermehrt die Hilfe online in der Technet. Dazu googlet 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. Im Browser lassen sich die Hilfetexte nach meinem Geschmack einfacher lesen und temporär verwalten, 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.

 

3 Get-Command

Mit dem cmdlet "get-command" (Alias: "gcm") kann man einfach nach cmdlets auch mit Platzhaltern suchen

get-command bzw. gcm liefert ohne weitere Parameter nur Laufwerke und cmdlets

 get-command get-c*

#Ausgabe gekürzt

CommandType     Name                 Definition
-----------     ----                 ----------
Cmdlet          Get-ChildItem        Get-ChildItem
Cmdlet          Get-Command          Get-Command
...
Cmdlet          Get-Counter          Get-Counter
Cmdlet          Get-Credential       Get-Credential
Cmdlet          Get-Culture          Get-Culture

 

#get-command –Commandtype Function bzw. gcm –Commandtype Function
gcm –Commandtype Function | format-table -auto

#gekürzte Ausgabe

CommandType Name               Definition
----------- ----               ----------
Function    A:                 Set-Location A:
Function    B:                 Set-Location B:

Interessant, wenn auch unübersichtlich ist der output von "gcm *" . 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"

 

Mit get-command lässt sich noch der Pfad zu einer Anwendung feststellen:

get-command ipconfig

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

 

4 Get-Member

get-member ist von den genannten 3 cmdlets wahrscheinlich am Anfang das Schwierigste zu verstehen.

Der Umgang mit get-member ist den nochVoraussetzung, 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 evtl. 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 Werte sind alle Powershell-Eigenschaften und Methoden dieses cmdlets  ausser 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.

Zusätzlich erhält man in der Ausgabenzeile "Typename: ........" die zugrunde liegende .Net Klasse (siehe Kapitel: Arbeiten mit .Net)

Beispiel: .Net Klasse, Default Methoden und Eigenschaften des cmdlets " get-date" bestimmen

#Senden von "get-date" nach "get-member" ohne Parameter
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;}
DateTime             ScriptProperty System.Object DateTime {get=if ((& { Set-StrictMode -Version 1;

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]

daraus kann man folgende Befehle ableiten

(get-date).date #<-Property
(get-date).ToLongTimeString() #<-Methoden mit ()

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


Beispiel: Erforschen eines String-Objects mit get-member

$a="Mein Freund Karl Napf
$a | gm

#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

$a.ToLower()
$a.Replace("N","Kl") #<-sieh auch Kapitel über regularExpressions

#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]  bzw. das cmdlet (get-date) haben u.a. folgende statische Werte
(Ich konnte keinen Weg finden, statische Methoden direkt auf get-date anwenden zu können)

Beispiel: Ermitteln der statischen Eigenschaften und Methoden von get-date bzw. [system.datetime]

#Senden der Klasse [system.datetime] nach get-member
[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 folgende 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: statische Eigenschaften von [system.datetime] 

#Bestimmen, ob 2009 ein Schaltjahr ist
[system.datetime]::isleapyear(2009)

#Ausgabe
False

 

#Bestimmen des höchsten Datums, mit dem die Klasse 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

 

"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 | gm -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, System.Secur...

 

#Starten eines weiteren Processes z.B. notepad
[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 Prozesses
(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")

 (Auf Prozesse gehe ich im Kapitel Prozesse näher ein)

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 ausser dem folgenden Beispiel nicht weiter darauf eingehen werde

Beispiel: compilergenerierte Methoden get_date()

Get-date).get_date()
Samstag, 11. April 2009 00:00:00

#ist gleichwertig zu
(Get-date).date
Samstag, 11. April 2009 00:00:00

Beispiel: 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, DisplayName, Dependent...
psbase                    MemberSet     psbase {CanPauseAndContinue, CanShutdown, CanStop, DisplayName, DependentSer...
psextended                MemberSet     psextended {Name, RequiredServices}
psobject                  MemberSet     psobject {Members, Properties, Methods, ImmediateBaseObject, BaseObject, Typ...
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  http://user.psbase.invok$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: Vergleich der Methoden und Objekte von get-process mit PSBASE und ohne PSBASE

notepad #Instanz von notepad starten
$a=get-process notepad
$a.psbase | gm  #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()…

 

notepad #Instanz von notepad starten
$a=get-process notepad
$a | gm # 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: Vergleich der Methoden und Objekte der WMI-Klasse 'win32_operatingsystem' mit PSBASE und ohne 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

 

$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 viel, 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'

 #Skript

$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. Jed
riebssystem, 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 und erhält man so: System.__ComObject

 

#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 und erhält man so: System.__ComObject

#Example 4

$username="CN=Karl Napf,OU=powershelltest,DC=dom1,DC=de" 
$user=[ADSI]"LDAP://$username"
$user | gm

#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.

Beispiel: 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

 

$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

 

$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

 

$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

#Ausgabe
False  #d.h. user ist enabled