Behandelte Themen
Einleitung Get-Help
Beispiele: Inhalte der Onlinehilfe anhand von remove-item
Beispiele: Erweiterte Anwendung von Get-helpGet-Command Get-Member
4.1get-member ohne Parameter
Beispiel: .Net Klasse, Default Methoden und eigenschaften des cmdlets " get-date" bestimmen
Beispiel: Erforschen eines Skript-Objects mit get-member
4.2get-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.3get-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
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 (
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
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?
-- 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
-- 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
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
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:
#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:
#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
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