Kapitel 3: Entdecken von Objekten, Eigenschaften und Methoden
Meine erste Begegnung mit Computern war ein Commodore 64, aber mein erster moderner Computer war ein 286 12-MHz-IBM-Klon mit 1 MB Arbeitsspeicher, einer 40 MB-Festplatte und einem 5-1/4-Zoll-Diskettenlaufwerk mit einem CGA-Monitor, der unter Microsoft DOS 3.3 lief.
Viele IT-Spezialisten, wie ich selbst, sind kein Fremder in der Befehlszeile, aber wenn das Thema von Objekten, Eigenschaften und Methoden aufkommt, erhalten sie den Deer in den Scheinwerfern aussehen und sagen: "Ich bin kein Entwickler." Erraten Sie, was? Sie müssen kein Entwickler sein, um erfolgreich mit PowerShell zu arbeiten. Verzetteln Sie sich nicht bei der Terminologie. Nicht alles mag anfänglich Sinn ergeben, aber nach ein wenig praktischer Erfahrung werden Sie immer öfter diese „Mir geht ein Licht auf“-Momente erleben. „Aha! Also das war im Buch gemeint.“
Stellen Sie sicher, dass Sie die Beispiele auf Ihrem Computer ausprobieren, um praktische Erfahrung zu sammeln.
Anforderungen
Das Active Directory PowerShell-Modul ist für einige der in diesem Kapitel gezeigten Beispiele erforderlich. Das Modul ist Bestandteil der Remoteserver-Verwaltungstools (Remote Server Administration Tools, RSAT) für Windows. Für den Build 1809 (oder höher) von Windows werden die RSAT-Tools als Windows-Funktion installiert. Die Unterstützung für Active Directory ist unter Windows Home nicht verfügbar.
- Informationen zum Installieren der RSAT-Tools finden Sie unter Windows-Verwaltungsmodule.
- Informationen zu älteren Versionen von Windows finden Sie unter RSAT für Windows.
Get-Member
Get-Member
hilft Ihnen herauszufinden, welche Objekte, Eigenschaften und Methoden für Befehle verfügbar sind.
Jeder Befehl, der eine objektbasierte Ausgabe erzeugt, kann per Pipeline an Get-Member
weitergeleitet werden. Eine Eigenschaft ist ein Merkmal eines Elements. Ihr Führerschein besitzt eine Eigenschaft namens „Augenfarbe“, und die häufigsten Werte für diese Eigenschaft sind „Blau“ und „Braun“. Eine Methode ist eine Aktion, die an einem Objekt vorgenommen werden kann. Um im Führerscheinbeispiel zu bleiben: Eine der Methoden ist „Entziehen“ (Revoke), weil das Straßenverkehrsamt Ihren Führerschein einziehen kann.
Eigenschaften
Im folgenden Beispiel rufe ich Informationen zum Windows-Zeitdienst ab, der auf meinem Computer ausgeführt wird.
Get-Service -Name w32time
Status Name DisplayName
------ ---- -----------
Running w32time Windows Time
Status, Nameund DisplayName (Anzeigename) sind Beispiele für Eigenschaften, wie im vorherigen Resultset gezeigt. Der Wert der Eigenschaft Status ist Running
, der Wert der Eigenschaft Name ist w32time
, und der Wert von DisplayName ist Windows Time
.
Nun leite ich denselben Befehl per Pipeline an Get-Member
weiter:
Get-Service -Name w32time | Get-Member
TypeName: System.ServiceProcess.ServiceController
Name MemberType Definition
---- ---------- ----------
Name AliasProperty Name = ServiceName
RequiredServices AliasProperty RequiredServices = ServicesDependedOn
Disposed Event System.EventHandler Disposed(System.Object, Sy...
Close Method void Close()
Continue Method void Continue()
CreateObjRef Method System.Runtime.Remoting.ObjRef CreateObjRef(ty...
Dispose Method void Dispose(), void IDisposable.Dispose()
Equals Method bool Equals(System.Object obj)
ExecuteCommand Method void ExecuteCommand(int command)
GetHashCode Method int GetHashCode()
GetLifetimeService Method System.Object GetLifetimeService()
GetType Method type GetType()
InitializeLifetimeService Method System.Object InitializeLifetimeService()
Pause Method void Pause()
Refresh Method void Refresh()
Start Method void Start(), void Start(string[] args)
Stop Method void Stop()
WaitForStatus Method void WaitForStatus(System.ServiceProcess.Servi...
CanPauseAndContinue Property bool CanPauseAndContinue {get;}
CanShutdown Property bool CanShutdown {get;}
CanStop Property bool CanStop {get;}
Container Property System.ComponentModel.IContainer Container {get;}
DependentServices Property System.ServiceProcess.ServiceController[] Depe...
DisplayName Property string DisplayName {get;set;}
MachineName Property string MachineName {get;set;}
ServiceHandle Property System.Runtime.InteropServices.SafeHandle Serv...
ServiceName Property string ServiceName {get;set;}
ServicesDependedOn Property System.ServiceProcess.ServiceController[] Serv...
ServiceType Property System.ServiceProcess.ServiceType ServiceType ...
Site Property System.ComponentModel.ISite Site {get;set;}
StartType Property System.ServiceProcess.ServiceStartMode StartTy...
Status Property System.ServiceProcess.ServiceControllerStatus ...
ToString ScriptMethod System.Object ToString();
Die erste Zeile der Ergebnisse im vorherigen Beispiel enthält eine sehr wichtige Information. TypeName gibt an, welcher Objekttyp zurückgegeben wurde. In diesem Beispiel wurde ein System.ServiceProcess.ServiceController-Objekt zurückgegeben. Dies wird häufig als der Teil von TypeName direkt hinter dem letzten Punkt abgekürzt, in diesem Beispiel also ServiceController.
Sobald Sie wissen, welcher Objekttyp von einem Befehl erzeugt wird, können Sie diese Information verwenden, um Befehle zu identifizieren, die diesen Objekttyp als Eingabe akzeptieren.
Get-Command -ParameterType ServiceController
CommandType Name Version Source
----------- ---- ------- ------
Cmdlet Get-Service 3.1.0.0 Microsof...
Cmdlet Restart-Service 3.1.0.0 Microsof...
Cmdlet Resume-Service 3.1.0.0 Microsof...
Cmdlet Set-Service 3.1.0.0 Microsof...
Cmdlet Start-Service 3.1.0.0 Microsof...
Cmdlet Stop-Service 3.1.0.0 Microsof...
Cmdlet Suspend-Service 3.1.0.0 Microsof...
Alle diese Befehle verfügen über einen Parameter, der einen ServiceController-Objekttyp per Pipeline, Parametereingabe oder über beides akzeptiert.
Beachten Sie, dass es mehr Eigenschaften gibt, als standardmäßig angezeigt werden. Obwohl diese zusätzlichen Eigenschaften standardmäßig nicht angezeigt werden, können Sie in der Pipeline ausgewählt werden, indem Sie den Befehl per Pipeline an das Cmdlet Select-Object
weiterleiten und den Parameter Property verwenden. Im folgenden Beispiel werden alle Eigenschaften ausgewählt, indem die Ergebnisse von Get-Service
per Pipeline an Select-Object
weitergeleitet werden und das Platzhalterzeichen *
als Wert für den Parameter Property angegeben wird.
Get-Service -Name w32time | Select-Object -Property *
Name : w32time
RequiredServices : {}
CanPauseAndContinue : False
CanShutdown : True
CanStop : True
DisplayName : Windows Time
DependentServices : {}
MachineName : .
ServiceName : w32time
ServicesDependedOn : {}
ServiceHandle : SafeServiceHandle
Status : Running
ServiceType : Win32ShareProcess
StartType : Manual
Site :
Container :
Bestimmte Eigenschaften lassen sich auch auswählen, indem an den Parameter Property eine durch Trennzeichen getrennte Liste als Wert übergeben wird.
Get-Service -Name w32time | Select-Object -Property Status, Name, DisplayName, ServiceType
Status Name DisplayName ServiceType
------ ---- ----------- -----------
Running w32time Windows Time Win32ShareProcess
Standardmäßig werden vier Eigenschaften in einer Tabelle zurückgegeben und fünf oder mehr in einer Liste. Einige Befehle verwenden benutzerdefinierte Formatierung, um außer Kraft zu setzen, wie viele Eigenschaften standardmäßig in einer Tabelle angezeigt werden.
Es gibt mehrere Format-*
-Cmdlets, die verwendet werden können, um diese Standardeinstellungen manuell zu überschreiben. Die gängigsten sind Format-Table
und Format-List
, die beide in einem zukünftigen Kapitel behandelt werden.
Platzhalterzeichen können beim Angeben der Eigenschaftsnamen mit Select-Object
verwendet werden.
Get-Service -Name w32time | Select-Object -Property Status, DisplayName, Can*
Status : Running
DisplayName : Windows Time
CanPauseAndContinue : False
CanShutdown : True
CanStop : True
Im vorherigen Beispiel wurde Can*
als einer der Werte für den Parameter Property verwendet, um alle Eigenschaften zurückzugeben, die mit Can
beginnen. Hierzu gehören CanPauseAndContinue, CanShutdown und CanStop.
Methoden
Methoden sind Aktionen, die ausgeführt werden können. Verwenden Sie den Parameter MemberType, um die Ergebnisse von Get-Member
so einzugrenzen, dass nur die Methoden für Get-Service
angezeigt werden.
Get-Service -Name w32time | Get-Member -MemberType Method
TypeName: System.ServiceProcess.ServiceController
Name MemberType Definition
---- ---------- ----------
Close Method void Close()
Continue Method void Continue()
CreateObjRef Method System.Runtime.Remoting.ObjRef CreateObjRef(type ...
Dispose Method void Dispose(), void IDisposable.Dispose()
Equals Method bool Equals(System.Object obj)
ExecuteCommand Method void ExecuteCommand(int command)
GetHashCode Method int GetHashCode()
GetLifetimeService Method System.Object GetLifetimeService()
GetType Method type GetType()
InitializeLifetimeService Method System.Object InitializeLifetimeService()
Pause Method void Pause()
Refresh Method void Refresh()
Start Method void Start(), void Start(string[] args)
Stop Method void Stop()
WaitForStatus Method void WaitForStatus(System.ServiceProcess.ServiceC...
Wie sie sehen können, gibt es zahlreiche Methoden. Mithilfe der Stop-Methode können Sie einen Windows-Dienst beenden.
(Get-Service -Name w32time).Stop()
Nun überprüfen wir, ob der Windows-Zeitdienst tatsächlich beendet wurde.
Get-Service -Name w32time
Status Name DisplayName
------ ---- -----------
Stopped w32time Windows Time
Ich selbst verwende diese Methoden selten, aber Sie sollten sie dennoch kennen. Es kann vorkommen, dass Ihnen ein Get-*
-Befehl begegnet, ohne dass ein entsprechender Befehl zum Ändern des Elements vorhanden wäre.
Häufig kann dann eine Methode verwendet werden, um eine Aktion auszuführen, mit der das Element geändert wird. Das Cmdlet Get-SqlAgentJob
im SqlServer PowerShell-Modul ist ein gutes Beispiel dafür. Das Modul wird als Bestandteil von SQL Server Management Studio (SSMS) installiert. Es gibt kein entsprechendes Set-*
-Cmdlet, aber dieselbe Aufgabe kann mit einer Methode erledigt werden.
Ein weiterer Grund, Methoden zu kennen, besteht darin, dass viele Einsteiger davon ausgehen, dass mit Get-*
-Befehlen keine destruktiven Änderungen möglich sind. Allerdings können sie schwerwiegende Probleme verursachen, wenn Sie nicht ordnungsgemäß verwendet werden.
Eine bessere Option ist es, ein Cmdlet zu verwenden, um die Aktion auszuführen, wenn eins vorhanden ist. Fahren Sie fort, und starten Sie den Windows-Zeitdienst, nur diesmal mit dem Unterschied, dass Sie das Cmdlet zum Starten von Diensten verwenden.
Get-Service -Name w32time | Start-Service -PassThru
Status Name DisplayName
------ ---- -----------
Running w32time Windows Time
Standardmäßig gibt Start-Service
keine Ergebnisse zurück, genau wie die Start-Methode von Get-Service
.
Einer der Vorteile bei der Verwendung eines Cmdlets ist jedoch, dass das Cmdlet oft zusätzliche Funktionen bietet, die mit einer Methode nicht verfügbar sind. Im vorherigen Beispiel wurde der Parameter PassThru verwendet. Dieser bewirkt, dass ein Cmdlet, das normalerweise keine Ausgabe erzeugt, Ausgaben erzeugt.
Seien Sie immer vorsichtig mit Annahmen zur Ausgabe eines Cmdlets. Wir alle wissen, was passiert, wenn man etwas voraussetzt. Ich rufe nun Informationen über den PowerShell-Prozess, der auf meinem Computer in der Windows 10-Laborumgebung ausgeführt wird, ab.
Get-Process -Name PowerShell
Handles NPM(K) PM(K) WS(K) CPU(s) Id SI ProcessName
------- ------ ----- ----- ------ -- -- -----------
922 48 107984 140552 2.84 9020 1 powershell
Nun leite ich denselben Befehl per Pipeline an „Get-Member“ weiter:
Get-Process -Name PowerShell | Get-Member
TypeName: System.Diagnostics.Process
Name MemberType Definition
---- ---------- ----------
Handles AliasProperty Handles = Handlecount
Name AliasProperty Name = ProcessName
NPM AliasProperty NPM = NonpagedSystemMemorySize64
PM AliasProperty PM = PagedMemorySize64
SI AliasProperty SI = SessionId
VM AliasProperty VM = VirtualMemorySize64
WS AliasProperty WS = WorkingSet64
Disposed Event System.EventHandler Disposed(System.Object, ...
ErrorDataReceived Event System.Diagnostics.DataReceivedEventHandler ...
Exited Event System.EventHandler Exited(System.Object, Sy...
OutputDataReceived Event System.Diagnostics.DataReceivedEventHandler ...
BeginErrorReadLine Method void BeginErrorReadLine()
BeginOutputReadLine Method void BeginOutputReadLine()
CancelErrorRead Method void CancelErrorRead()
CancelOutputRead Method void CancelOutputRead()
Close Method void Close()
CloseMainWindow Method bool CloseMainWindow()
CreateObjRef Method System.Runtime.Remoting.ObjRef CreateObjRef(...
Dispose Method void Dispose(), void IDisposable.Dispose()
Equals Method bool Equals(System.Object obj)
GetHashCode Method int GetHashCode()
GetLifetimeService Method System.Object GetLifetimeService()
GetType Method type GetType()
InitializeLifetimeService Method System.Object InitializeLifetimeService()
Kill Method void Kill()
Refresh Method void Refresh()
Start Method bool Start()
ToString Method string ToString()
WaitForExit Method bool WaitForExit(int milliseconds), void Wai...
WaitForInputIdle Method bool WaitForInputIdle(int milliseconds), boo...
__NounName NoteProperty string __NounName=Process
BasePriority Property int BasePriority {get;}
Container Property System.ComponentModel.IContainer Container {...
EnableRaisingEvents Property bool EnableRaisingEvents {get;set;}
ExitCode Property int ExitCode {get;}
ExitTime Property datetime ExitTime {get;}
Handle Property System.IntPtr Handle {get;}
HandleCount Property int HandleCount {get;}
HasExited Property bool HasExited {get;}
Id Property int Id {get;}
MachineName Property string MachineName {get;}
MainModule Property System.Diagnostics.ProcessModule MainModule ...
MainWindowHandle Property System.IntPtr MainWindowHandle {get;}
MainWindowTitle Property string MainWindowTitle {get;}
MaxWorkingSet Property System.IntPtr MaxWorkingSet {get;set;}
MinWorkingSet Property System.IntPtr MinWorkingSet {get;set;}
Modules Property System.Diagnostics.ProcessModuleCollection M...
NonpagedSystemMemorySize Property int NonpagedSystemMemorySize {get;}
NonpagedSystemMemorySize64 Property long NonpagedSystemMemorySize64 {get;}
PagedMemorySize Property int PagedMemorySize {get;}
PagedMemorySize64 Property long PagedMemorySize64 {get;}
PagedSystemMemorySize Property int PagedSystemMemorySize {get;}
PagedSystemMemorySize64 Property long PagedSystemMemorySize64 {get;}
PeakPagedMemorySize Property int PeakPagedMemorySize {get;}
PeakPagedMemorySize64 Property long PeakPagedMemorySize64 {get;}
PeakVirtualMemorySize Property int PeakVirtualMemorySize {get;}
PeakVirtualMemorySize64 Property long PeakVirtualMemorySize64 {get;}
PeakWorkingSet Property int PeakWorkingSet {get;}
PeakWorkingSet64 Property long PeakWorkingSet64 {get;}
PriorityBoostEnabled Property bool PriorityBoostEnabled {get;set;}
PriorityClass Property System.Diagnostics.ProcessPriorityClass Prio...
PrivateMemorySize Property int PrivateMemorySize {get;}
PrivateMemorySize64 Property long PrivateMemorySize64 {get;}
PrivilegedProcessorTime Property timespan PrivilegedProcessorTime {get;}
ProcessName Property string ProcessName {get;}
ProcessorAffinity Property System.IntPtr ProcessorAffinity {get;set;}
Responding Property bool Responding {get;}
SafeHandle Property Microsoft.Win32.SafeHandles.SafeProcessHandl...
SessionId Property int SessionId {get;}
Site Property System.ComponentModel.ISite Site {get;set;}
StandardError Property System.IO.StreamReader StandardError {get;}
StandardInput Property System.IO.StreamWriter StandardInput {get;}
StandardOutput Property System.IO.StreamReader StandardOutput {get;}
StartInfo Property System.Diagnostics.ProcessStartInfo StartInf...
StartTime Property datetime StartTime {get;}
SynchronizingObject Property System.ComponentModel.ISynchronizeInvoke Syn...
Threads Property System.Diagnostics.ProcessThreadCollection T...
TotalProcessorTime Property timespan TotalProcessorTime {get;}
UserProcessorTime Property timespan UserProcessorTime {get;}
VirtualMemorySize Property int VirtualMemorySize {get;}
VirtualMemorySize64 Property long VirtualMemorySize64 {get;}
WorkingSet Property int WorkingSet {get;}
WorkingSet64 Property long WorkingSet64 {get;}
PSConfiguration PropertySet PSConfiguration {Name, Id, PriorityClass, Fi...
PSResources PropertySet PSResources {Name, Id, Handlecount, WorkingS...
Company ScriptProperty System.Object Company {get=$this.Mainmodule....
CPU ScriptProperty System.Object CPU {get=$this.TotalProcessorT...
Description ScriptProperty System.Object Description {get=$this.Mainmod...
FileVersion ScriptProperty System.Object FileVersion {get=$this.Mainmod...
Path ScriptProperty System.Object Path {get=$this.Mainmodule.Fil...
Product ScriptProperty System.Object Product {get=$this.Mainmodule....
ProductVersion ScriptProperty System.Object ProductVersion {get=$this.Main...
Beachten Sie, dass mehr Eigenschaften aufgelistet werden, als standardmäßig angezeigt würden. Eine Reihe der angezeigten Standardeigenschaften wird nicht als Eigenschaften angezeigt, wenn die Ergebnisse von Get-Member
angezeigt werden. Dies liegt daran, dass viele der angezeigten Werte, z. B. NPM(K)
, PM(K)
, WS(K)
und CPU(s)
berechnete Eigenschaften sind. Um die tatsächlichen Eigenschaftsnamen zu bestimmen, muss der Befehl per Pipeline an Get-Member
weitergeleitet werden.
Wenn ein Befehl keine Ausgabe erzeugt, kann er nicht per Pipeline an Get-Member
weitergeleitet werden. Da Start-Service
standardmäßig keine Ausgabe erzeugt, wird ein Fehler generiert, wenn Sie versuchen, ihn per Pipeline an Get-Member
weiterzuleiten.
Start-Service -Name w32time | Get-Member
Get-Member : You must specify an object for the Get-Member cmdlet.
At line:1 char:31
+ Start-Service -Name w32time | Get-Member
+
+ CategoryInfo : CloseError: (:) [Get-Member], InvalidOperationException
+ FullyQualifiedErrorId : NoObjectInGetMember,Microsoft.PowerShell.Commands.GetMembe
rCommand
Der Parameter PassThru kann mit dem Cmdlet Start-Service
angegeben werden, damit eine Ausgabe erzeugt wird, die dann ohne einen Fehler per Pipeline an Get-Member
weitergeleitet wird.
Start-Service -Name w32time -PassThru | Get-Member
TypeName: System.ServiceProcess.ServiceController
Name MemberType Definition
---- ---------- ----------
Name AliasProperty Name = ServiceName
RequiredServices AliasProperty RequiredServices = ServicesDependedOn
Disposed Event System.EventHandler Disposed(System.Object, Sy...
Close Method void Close()
Continue Method void Continue()
CreateObjRef Method System.Runtime.Remoting.ObjRef CreateObjRef(ty...
Dispose Method void Dispose(), void IDisposable.Dispose()
Equals Method bool Equals(System.Object obj)
ExecuteCommand Method void ExecuteCommand(int command)
GetHashCode Method int GetHashCode()
GetLifetimeService Method System.Object GetLifetimeService()
GetType Method type GetType()
InitializeLifetimeService Method System.Object InitializeLifetimeService()
Pause Method void Pause()
Refresh Method void Refresh()
Start Method void Start(), void Start(string[] args)
Stop Method void Stop()
WaitForStatus Method void WaitForStatus(System.ServiceProcess.Servi...
CanPauseAndContinue Property bool CanPauseAndContinue {get;}
CanShutdown Property bool CanShutdown {get;}
CanStop Property bool CanStop {get;}
Container Property System.ComponentModel.IContainer Container {get;}
DependentServices Property System.ServiceProcess.ServiceController[] Depe...
DisplayName Property string DisplayName {get;set;}
MachineName Property string MachineName {get;set;}
ServiceHandle Property System.Runtime.InteropServices.SafeHandle Serv...
ServiceName Property string ServiceName {get;set;}
ServicesDependedOn Property System.ServiceProcess.ServiceController[] Serv...
ServiceType Property System.ServiceProcess.ServiceType ServiceType ...
Site Property System.ComponentModel.ISite Site {get;set;}
StartType Property System.ServiceProcess.ServiceStartMode StartTy...
Status Property System.ServiceProcess.ServiceControllerStatus ...
ToString ScriptMethod System.Object ToString();
Damit ein Befehl per Pipeline an Get-Member
weitergeleitet werden kann, muss er eine objektbasierte Ausgabe erzeugen.
Get-Service -Name w32time | Out-Host | Get-Member
Status Name DisplayName
------ ---- -----------
Running w32time Windows Time
Get-Member : You must specify an object for the Get-Member cmdlet.
At line:1 char:40
+ Get-Service -Name w32time | Out-Host | Get-Member
+
+ CategoryInfo : CloseError: (:) [Get-Member], InvalidOperationException
+ FullyQualifiedErrorId : NoObjectInGetMember,Microsoft.PowerShell.Commands.GetMemberCommand
Out-Host
schreibt direkt in den PowerShell-Host, aber es erzeugt keine objektbasierte Ausgabe für die Pipeline. Somit kann es nicht per Pipeline an Get-Member
weitergeleitet werden.
Active Directory
Hinweis
Die im Abschnitt „Anforderungen“ dieses Kapitels aufgeführten Remoteserver-Verwaltungstools, sind erforderlich, um diesen Abschnitt abzuschließen. Außerdem, wie in der Einführung dieses Buchs erwähnt, muss Ihr Computer in der Windows 10-Laborumgebung Mitglied der Domäne der Laborumgebung sein.
Verwenden Sie Get-Command
mit dem Parameter Module, um zu bestimmen, welche Befehle als Teil des ActiveDirectory PowerShell-Moduls bei der Installation der Remoteserver-Verwaltungstools hinzugefügt wurden.
Get-Command -Module ActiveDirectory
CommandType Name Version Source
----------- ---- ------- ------
Cmdlet Add-ADCentralAccessPolicyMember 1.0.0.0 ActiveDi...
Cmdlet Add-ADComputerServiceAccount 1.0.0.0 ActiveDi...
Cmdlet Add-ADDomainControllerPasswordReplicationPolicy 1.0.0.0 ActiveDi...
Cmdlet Add-ADFineGrainedPasswordPolicySubject 1.0.0.0 ActiveDi...
Cmdlet Add-ADGroupMember 1.0.0.0 ActiveDi...
Cmdlet Add-ADPrincipalGroupMembership 1.0.0.0 ActiveDi...
Cmdlet Add-ADResourcePropertyListMember 1.0.0.0 ActiveDi...
Cmdlet Clear-ADAccountExpiration 1.0.0.0 ActiveDi...
Cmdlet Clear-ADClaimTransformLink 1.0.0.0 ActiveDi...
Cmdlet Disable-ADAccount 1.0.0.0 ActiveDi...
...
Insgesamt wurden 147 Befehle als Teil des ActiveDirectory PowerShell-Moduls hinzugefügt. Einige von diesen Befehlen geben standardmäßig nur einen Teil der verfügbaren Eigenschaften zurück.
Haben Sie einen Unterschied bei den Namen der Befehle in diesem Modul bemerkt? Der Nomen-Teil der Befehle besitzt ein AD-Präfix. Dies finden Sie häufig bei den Befehlen der meisten Module. Das Präfix dient der Vermeidung von Benennungskonflikten.
Get-ADUser -Identity mike | Get-Member
TypeName: Microsoft.ActiveDirectory.Management.ADUser
Name MemberType Definition
---- ---------- ----------
Contains Method bool Contains(string propertyName)
Equals Method bool Equals(System.Object obj)
GetEnumerator Method System.Collections.IDictionaryEnumerator GetEn...
GetHashCode Method int GetHashCode()
GetType Method type GetType()
ToString Method string ToString()
Item ParameterizedProperty Microsoft.ActiveDirectory.Management.ADPropert...
DistinguishedName Property System.String DistinguishedName {get;set;}
Enabled Property System.Boolean Enabled {get;set;}
GivenName Property System.String GivenName {get;set;}
Name Property System.String Name {get;}
ObjectClass Property System.String ObjectClass {get;set;}
ObjectGUID Property System.Nullable`1[[System.Guid, mscorlib, Vers...
SamAccountName Property System.String SamAccountName {get;set;}
SID Property System.Security.Principal.SecurityIdentifier S...
Surname Property System.String Surname {get;set;}
UserPrincipalName Property System.String UserPrincipalName {get;set;}
Selbst wenn Sie nur entfernt mit Active Directory vertraut sind, wissen Sie wahrscheinlich, dass ein Benutzerkonto über mehr Eigenschaften verfügt, als in diesem Beispiel gezeigt werden.
Das Cmdlet Get-ADUser
verfügt über einen Parameter Properties, der verwendet wird, um die zusätzlichen (nicht standardmäßigen) Eigenschaften anzugeben, die Sie zurückgegeben haben möchten. Wenn Sie das Platzhalterzeichen *
angeben, werden alle zurückgegeben.
Get-ADUser -Identity mike -Properties * | Get-Member
TypeName: Microsoft.ActiveDirectory.Management.ADUser
Name MemberType Definition
---- ---------- ----------
Contains Method bool Contains(string proper...
Equals Method bool Equals(System.Object obj)
GetEnumerator Method System.Collections.IDiction...
GetHashCode Method int GetHashCode()
GetType Method type GetType()
ToString Method string ToString()
Item ParameterizedProperty Microsoft.ActiveDirectory.M...
AccountExpirationDate Property System.DateTime AccountExpi...
accountExpires Property System.Int64 accountExpires...
AccountLockoutTime Property System.DateTime AccountLock...
AccountNotDelegated Property System.Boolean AccountNotDe...
AllowReversiblePasswordEncryption Property System.Boolean AllowReversi...
AuthenticationPolicy Property Microsoft.ActiveDirectory.M...
AuthenticationPolicySilo Property Microsoft.ActiveDirectory.M...
BadLogonCount Property System.Int32 BadLogonCount ...
badPasswordTime Property System.Int64 badPasswordTim...
badPwdCount Property System.Int32 badPwdCount {g...
CannotChangePassword Property System.Boolean CannotChange...
CanonicalName Property System.String CanonicalName...
Certificates Property Microsoft.ActiveDirectory.M...
City Property System.String City {get;set;}
CN Property System.String CN {get;}
codePage Property System.Int32 codePage {get;...
Company Property System.String Company {get;...
CompoundIdentitySupported Property Microsoft.ActiveDirectory.M...
Country Property System.String Country {get;...
countryCode Property System.Int32 countryCode {g...
Created Property System.DateTime Created {get;}
createTimeStamp Property System.DateTime createTimeS...
Deleted Property System.Boolean Deleted {get;}
Department Property System.String Department {g...
Description Property System.String Description {...
DisplayName Property System.String DisplayName {...
DistinguishedName Property System.String Distinguished...
Division Property System.String Division {get...
DoesNotRequirePreAuth Property System.Boolean DoesNotRequi...
dSCorePropagationData Property Microsoft.ActiveDirectory.M...
EmailAddress Property System.String EmailAddress ...
EmployeeID Property System.String EmployeeID {g...
EmployeeNumber Property System.String EmployeeNumbe...
Enabled Property System.Boolean Enabled {get...
Fax Property System.String Fax {get;set;}
GivenName Property System.String GivenName {ge...
HomeDirectory Property System.String HomeDirectory...
HomedirRequired Property System.Boolean HomedirRequi...
HomeDrive Property System.String HomeDrive {ge...
HomePage Property System.String HomePage {get...
HomePhone Property System.String HomePhone {ge...
Initials Property System.String Initials {get...
instanceType Property System.Int32 instanceType {...
isDeleted Property System.Boolean isDeleted {g...
KerberosEncryptionType Property Microsoft.ActiveDirectory.M...
LastBadPasswordAttempt Property System.DateTime LastBadPass...
LastKnownParent Property System.String LastKnownPare...
lastLogoff Property System.Int64 lastLogoff {ge...
lastLogon Property System.Int64 lastLogon {get...
LastLogonDate Property System.DateTime LastLogonDa...
lastLogonTimestamp Property System.Int64 lastLogonTimes...
LockedOut Property System.Boolean LockedOut {g...
logonCount Property System.Int32 logonCount {ge...
LogonWorkstations Property System.String LogonWorkstat...
Manager Property System.String Manager {get;...
MemberOf Property Microsoft.ActiveDirectory.M...
MNSLogonAccount Property System.Boolean MNSLogonAcco...
MobilePhone Property System.String MobilePhone {...
Modified Property System.DateTime Modified {g...
modifyTimeStamp Property System.DateTime modifyTimeS...
msDS-User-Account-Control-Computed Property System.Int32 msDS-User-Acco...
Name Property System.String Name {get;}
nTSecurityDescriptor Property System.DirectoryServices.Ac...
ObjectCategory Property System.String ObjectCategor...
ObjectClass Property System.String ObjectClass {...
ObjectGUID Property System.Nullable`1[[System.G...
objectSid Property System.Security.Principal.S...
Office Property System.String Office {get;s...
OfficePhone Property System.String OfficePhone {...
Organization Property System.String Organization ...
OtherName Property System.String OtherName {ge...
PasswordExpired Property System.Boolean PasswordExpi...
PasswordLastSet Property System.DateTime PasswordLas...
PasswordNeverExpires Property System.Boolean PasswordNeve...
PasswordNotRequired Property System.Boolean PasswordNotR...
POBox Property System.String POBox {get;set;}
PostalCode Property System.String PostalCode {g...
PrimaryGroup Property System.String PrimaryGroup ...
primaryGroupID Property System.Int32 primaryGroupID...
PrincipalsAllowedToDelegateToAccount Property Microsoft.ActiveDirectory.M...
ProfilePath Property System.String ProfilePath {...
ProtectedFromAccidentalDeletion Property System.Boolean ProtectedFro...
pwdAnswer Property System.String pwdAnswer {ge...
pwdLastSet Property System.Int64 pwdLastSet {ge...
pwdQuestion Property System.String pwdQuestion {...
SamAccountName Property System.String SamAccountNam...
sAMAccountType Property System.Int32 sAMAccountType...
ScriptPath Property System.String ScriptPath {g...
sDRightsEffective Property System.Int32 sDRightsEffect...
ServicePrincipalNames Property Microsoft.ActiveDirectory.M...
SID Property System.Security.Principal.S...
SIDHistory Property Microsoft.ActiveDirectory.M...
SmartcardLogonRequired Property System.Boolean SmartcardLog...
sn Property System.String sn {get;set;}
State Property System.String State {get;set;}
StreetAddress Property System.String StreetAddress...
Surname Property System.String Surname {get;...
Title Property System.String Title {get;set;}
TrustedForDelegation Property System.Boolean TrustedForDe...
TrustedToAuthForDelegation Property System.Boolean TrustedToAut...
UseDESKeyOnly Property System.Boolean UseDESKeyOnl...
userAccountControl Property System.Int32 userAccountCon...
userCertificate Property Microsoft.ActiveDirectory.M...
UserPrincipalName Property System.String UserPrincipal...
uSNChanged Property System.Int64 uSNChanged {get;}
uSNCreated Property System.Int64 uSNCreated {get;}
whenChanged Property System.DateTime whenChanged...
whenCreated Property System.DateTime whenCreated...
Jetzt sieht es schon eher so aus.
Können Sie sich einen Grund vorstellen, warum die Eigenschaften eines Active Directory-Benutzerkontos standardmäßig so eingeschränkt sein sollten? Stellen Sie sich vor, wenn Sie jede Eigenschaft für jedes Benutzerkonto in Ihrer Active Directory-Produktionsumgebung zurückgäben. Stellen Sie sich die Leistungsbeeinträchtigung vor, die Sie verursachen könnten, nicht nur bei den Domänencontrollern selbst, sondern auch in Ihrem Netzwerk. Es ist außerdem zweifelhaft, ob Sie tatsächlich jede Eigenschaft benötigen. Das Zurückgeben aller Eigenschaften für ein einzelnes Benutzerkonto ist absolut akzeptabel, wenn Sie feststellen möchten, welche Eigenschaften vorhanden sind.
Es ist nicht ungewöhnlich, einen Befehl bei der Prototypenerstellung mehrmals auszuführen. Wenn Sie eine sehr große Abfrage ausführen möchten, fragen Sie sie einmal ab, und speichern Sie die Ergebnisse in einer Variablen. Arbeiten Sie dann mit dem Inhalt der Variablen, anstatt wiederholt eine aufwändige Abfrage zu verwenden.
$Users = Get-ADUser -Identity mike -Properties *
Verwenden Sie den Inhalt der Variablen $Users
, anstatt den vorherigen Befehl mehrmals auszuführen.
Denken Sie daran, dass der Inhalt der Variablen nicht aktualisiert wird, wenn Änderungen an diesem Benutzer in Active Directory vorgenommen werden.
Sie könnten die Variable $Users
per Pipeline an Get-Member
weiterleiten, um die verfügbaren Eigenschaften zu ermitteln.
$Users | Get-Member
Wählen Sie dann die einzelnen Eigenschaften aus, indem Sie $Users
per Pipeline an Select-Object
weiterleiten, ohne dabei Active Directory jemals mehr als einmal abfragen zu müssen.
$Users | Select-Object -Property Name, LastLogonDate, LastBadPasswordAttempt
Wenn Sie Active Directory mehr als einmal Abfragen möchten, verwenden Sie den Parameter Properties, um alle nicht standardmäßigen Eigenschaften anzugeben, die Sie verwenden möchten.
Get-ADUser -Identity mike -Properties LastLogonDate, LastBadPasswordAttempt
DistinguishedName : CN=Mike F. Robbins,OU=Sales,DC=mikefrobbins,DC=com
Enabled : True
GivenName : Mike
LastBadPasswordAttempt : 2/4/2017 10:46:15 AM
LastLogonDate : 2/18/2017 12:45:14 AM
Name : Mike F. Robbins
ObjectClass : user
ObjectGUID : a82a8c58-1332-4a57-a6e2-68e0c750ea56
SamAccountName : mike
SID : S-1-5-21-2989741381-570885089-3319121794-1108
Surname : Robbins
UserPrincipalName : miker@mikefrobbins.com
Zusammenfassung
In diesem Kapitel haben Sie erfahren, wie Sie bestimmen, welchen Objekttyp ein Befehl erzeugt, wie Sie bestimmen, welche Eigenschaften und Methoden für einen Befehl verfügbar sind, und wie Sie mit Befehlen arbeiten, die die Eigenschaften begrenzen, die standardmäßig zurückgegeben werden.
Überprüfung
- Welchen Objekttyp erzeugt das Cmdlet
Get-Process
? - Wie bestimmen Sie die für einen Befehl verfügbaren Eigenschaften?
- Wenn es einen Befehl für das Abrufen, nicht aber für das Festlegen derselben Sache gibt, auf was sollten Sie überprüfen?
- Wie können Sie dafür sorgen, dass bestimmte Befehle, die standardmäßig keine Ausgabe erzeugen, eine Ausgabe erzeugen?
- Wenn Sie mit den Ergebnissen eines Befehls arbeiten möchten, der eine sehr große Menge an Ausgaben erzeugt, welche Aktion sollten Sie in Erwägung ziehen?
Empfohlene Lektüre
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Issues stufenweise als Feedbackmechanismus für Inhalte abbauen und durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unterFeedback senden und anzeigen für