Hoofdstuk 3: Objecten, eigenschappen en methoden detecteren

Mijn eerste inleiding tot computers was een Commodore 64, maar mijn eerste moderne computer was een 286 12-Mhz IBM-kloon met 1 megabyte aan geheugen, een harde schijf van 40 megabyte en een diskettestation van 5-1/4 inch met een CGA-monitor met Microsoft DOS 3.3.

Veel IT-professionals, zoals ikzelf, zijn niet vreemd voor de opdrachtregel, maar wanneer het onderwerp van objecten, eigenschappen en methoden opkomt, krijgen ze de herten in de koplampen eruit en zeggen: "Ik ben geen ontwikkelaar." Raad eens wat? U hoeft geen ontwikkelaar te zijn om succesvol te zijn met PowerShell. Verdomde niet in de terminologie. Niet alles kan in eerste instantie zinvol zijn, maar na een beetje praktijkervaring zul je die 'gloeilamp' momenten hebben. "Aha! Dat is waar het boek het over had."

Zorg ervoor dat u de voorbeelden op uw computer probeert om een deel van die praktische ervaring te krijgen.

Vereisten

De Active Directory PowerShell-module is vereist voor enkele voorbeelden die in dit hoofdstuk worden weergegeven. De module maakt deel uit van de Remote Server Beheer istration Tools (RSAT) voor Windows. Voor de build van 1809 (of hoger) van Windows worden de RSAT-hulpprogramma's geïnstalleerd als een Windows-functie. Ondersteuning voor Active Directory is niet beschikbaar op Windows Home.

Get-Member

Get-Member helpt u te ontdekken welke objecten, eigenschappen en methoden beschikbaar zijn voor opdrachten. Elke opdracht die objectgebaseerde uitvoer produceert, kan worden doorgesluisd naar Get-Member. Een eigenschap is een kenmerk van een item. Uw rijbewijs heeft een eigenschap genaamd oogkleur en de meest voorkomende waarden voor die eigenschap zijn blauw en bruin. Een methode is een actie die kan worden uitgevoerd op een item. Bij het verblijf bij het rijbewijsvoorbeeld is een van de methoden 'Intrekken' omdat de afdeling van motorvoertuigen uw rijbewijs kan intrekken.

Eigenschappen

In het volgende voorbeeld haal ik informatie op over de Windows Time-service die op mijn computer wordt uitgevoerd.

Get-Service -Name w32time
Status   Name               DisplayName
------   ----               -----------
Running  w32time            Windows Time

Status, Name en DisplayName zijn voorbeelden van eigenschappen, zoals wordt weergegeven in de vorige set resultaten. De waarde voor de eigenschap Status is Running, de waarde voor de eigenschap Naam is w32timeen de waarde voor DisplayName is Windows Time.

Nu sluis ik dezelfde opdracht door naar Get-Member:

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();

De eerste regel van de resultaten in het vorige voorbeeld bevat één stukje zeer belangrijke informatie. TypeName geeft aan welk type object is geretourneerd. In dit voorbeeld is een System.ServiceProcess.ServiceController-object geretourneerd. Dit wordt vaak afgekort als het gedeelte van de TypeName net na de laatste periode; ServiceController in dit voorbeeld.

Zodra u weet welk type object een opdracht produceert, kunt u deze informatie gebruiken om opdrachten te vinden die dat type object accepteren als invoer.

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

Al deze opdrachten hebben een parameter die een ServiceController-objecttype accepteert op pijplijn, parameterinvoer of beide.

U ziet dat er meer eigenschappen zijn dan standaard wordt weergegeven. Hoewel deze aanvullende eigenschappen niet standaard worden weergegeven, kunnen ze uit de pijplijn worden geselecteerd door de opdracht door te geven aan de Select-Object cmdlet en de parameter Eigenschap te gebruiken. In het volgende voorbeeld worden alle eigenschappen geselecteerd door de resultaten ervan Get-Service door te Select-Object sluizen en het * jokerteken op te geven als de waarde voor de parameter Eigenschap .

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           :

Specifieke eigenschappen kunnen ook worden geselecteerd met behulp van een door komma's gescheiden lijst voor de waarde van de parameter Eigenschap .

Get-Service -Name w32time | Select-Object -Property Status, Name, DisplayName, ServiceType
 Status Name    DisplayName        ServiceType
 ------ ----    -----------        -----------
Running w32time Windows Time Win32ShareProcess

Standaard worden vier eigenschappen geretourneerd in een tabel en worden er vijf of meer geretourneerd in een lijst. Sommige opdrachten gebruiken aangepaste opmaak om te overschrijven hoeveel eigenschappen standaard worden weergegeven in een tabel. Er zijn verschillende Format-* cmdlets die kunnen worden gebruikt om deze standaardinstellingen handmatig te overschrijven. De meest voorkomende zijn Format-Table en Format-List, beide zullen in een volgend hoofdstuk worden behandeld.

Jokertekens kunnen worden gebruikt bij het opgeven van de eigenschapsnamen met Select-Object.

Get-Service -Name w32time | Select-Object -Property Status, DisplayName, Can*
Status              : Running
DisplayName         : Windows Time
CanPauseAndContinue : False
CanShutdown         : True
CanStop             : True

In het vorige voorbeeld Can* is gebruikt als een van de waarden voor de parameter Eigenschap om alle eigenschappen te retourneren die beginnen met Can. Deze omvatten CanPauseAndContinue, CanShutdown en CanStop.

Methoden

Methoden zijn een actie die kan worden uitgevoerd. Gebruik de parameter MemberType om de resultaten te beperken, Get-Member zodat alleen de methoden voor Get-Serviceworden weergegeven.

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

Zoals u kunt zien, zijn er veel methoden. De stopmethode kan worden gebruikt om een Windows-service te stoppen.

(Get-Service -Name w32time).Stop()

Nu om te controleren of de Windows Time-service inderdaad is gestopt.

Get-Service -Name w32time
Status   Name               DisplayName
------   ----               -----------
Stopped  w32time            Windows Time

Ik vind mezelf zelden met behulp van methoden, maar ze zijn iets waar je rekening mee moet houden. Er zijn tijden dat u een Get-* opdracht tegenkomt zonder een bijbehorende opdracht om dat item te wijzigen. Vaak kan een methode worden gebruikt om een actie uit te voeren waarmee deze wordt gewijzigd. De Get-SqlAgentJob cmdlet in de SqlServer PowerShell-module is een goed voorbeeld hiervan. De module wordt geïnstalleerd als onderdeel van SQL Server Management Studio (SMSS). Er bestaat geen bijbehorende Set-* cmdlet, maar er kan een methode worden gebruikt om dezelfde taak te voltooien.

Een andere reden om op de hoogte te zijn van methoden is dat veel beginners ervan uitgaan dat destructieve wijzigingen niet kunnen worden aangebracht met Get-* opdrachten. Maar ze kunnen inderdaad ernstige problemen veroorzaken als ze ongepast worden gebruikt.

Een betere optie is om een cmdlet te gebruiken om de actie uit te voeren als deze bestaat. Start de Windows Time-service, behalve deze keer gebruikt u de cmdlet voor het starten van services.

Get-Service -Name w32time | Start-Service -PassThru
Status   Name               DisplayName
------   ----               -----------
Running  w32time            Windows Time

Start-Service Standaard worden er geen resultaten geretourneerd, net zoals de startmethode van Get-Service. Maar een van de voordelen van het gebruik van een cmdlet is dat vaak de cmdlet extra functionaliteit biedt die niet beschikbaar is met een methode. In het vorige voorbeeld is de Parameter PassThru gebruikt. Dit zorgt ervoor dat een cmdlet die normaal gesproken geen uitvoer produceert, uitvoer produceert.

Wees voorzichtig met veronderstellingen over de uitvoer van een cmdlet. We weten allemaal wat er gebeurt als je van dingen uitgaat. Ik haal informatie op over het PowerShell-proces dat wordt uitgevoerd op mijn Windows 10-testomgevingscomputer.

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

Nu sluis ik dezelfde opdracht door naar Get-Member:

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

U ziet dat er meer eigenschappen worden weergegeven dan standaard wordt weergegeven. Een aantal standaardeigenschappen dat wordt weergegeven, worden niet weergegeven als eigenschappen bij het weergeven van de resultaten van Get-Member. Dit komt doordat veel van de weergegeven waarden, zoals NPM(K), PM(K), WS(K)en CPU(s), berekende eigenschappen zijn. Als u de werkelijke eigenschapsnamen wilt bepalen, moet de opdracht worden doorgesluisd naar Get-Member.

Als een opdracht geen uitvoer produceert, kan deze niet worden doorgesluisd naar Get-Member. Omdat Start-Service er standaard geen uitvoer wordt geproduceerd, wordt er een fout gegenereerd wanneer u deze probeert door te geven.Get-Member

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

De PassThru-parameter kan worden opgegeven met de Start-Service cmdlet om uitvoer te produceren, die vervolgens zonder fouten wordt Get-Member doorgesluisd.

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();

Als u wilt doorsluisen naar Get-Member, moet een opdracht uitvoer op basis van objecten produceren.

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 schrijft rechtstreeks naar de PowerShell-host, maar produceert geen uitvoer op basis van objecten voor de pijplijn. Het kan dus niet worden doorgesluisd naar Get-Member.

Active Directory

Notitie

De hulpprogramma's voor externe server Beheer istration die worden vermeld in de sectie Vereisten van dit hoofdstuk, zijn vereist om deze sectie te voltooien. Zoals vermeld in de inleiding tot dit boek, moet uw Windows 10-testomgevingcomputer lid zijn van het domein van de testomgeving.

Gebruik Get-Command met de moduleparameter om te bepalen welke opdrachten zijn toegevoegd als onderdeel van de ActiveDirectory PowerShell-module wanneer de externe serverbeheerprogramma's zijn geïnstalleerd.

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

Er zijn in totaal 147 opdrachten toegevoegd als onderdeel van de ActiveDirectory PowerShell-module. Sommige opdrachten van deze opdrachten retourneren standaard slechts een gedeelte van de beschikbare eigenschappen.

Hebt u iets anders gezien over de namen van de opdrachten in deze module? Het zelfstandig naamwoordgedeelte van de opdrachten heeft een AD-voorvoegsel. Dit is gebruikelijk voor de opdrachten van de meeste modules. Het voorvoegsel is ontworpen om naamconflicten te voorkomen.

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;}

Zelfs als u slechts vaag bekend bent met Active Directory, weet u waarschijnlijk dat een gebruikersaccount meer eigenschappen heeft dan in dit voorbeeld wordt weergegeven.

De Get-ADUser cmdlet heeft een parameter Properties die wordt gebruikt om de aanvullende (niet-standaard) eigenschappen op te geven die u wilt retourneren. Als u het * jokerteken opgeeft, worden deze allemaal geretourneerd.

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

Nu lijkt dat er meer op.

Kunt u een reden bedenken waarom de eigenschappen van een Active Directory-gebruikersaccount standaard zo beperkt zijn? Stel dat u elke eigenschap hebt geretourneerd voor elk gebruikersaccount in uw Active Directory-productieomgeving. Denk aan de prestatievermindering die u kunt veroorzaken, niet alleen voor de domeincontrollers zelf, maar ook voor uw netwerk. Het is twijfelachtig dat je eigenlijk elke eigenschap toch nodig hebt. Het retourneren van alle eigenschappen voor één gebruikersaccount is perfect acceptabel wanneer u probeert te bepalen welke eigenschappen er bestaan.

Het is niet ongebruikelijk om een opdracht vaak uit te voeren wanneer u deze prototypen maakt. Als u een enorme query gaat uitvoeren, voert u een query uit en slaat u de resultaten op in een variabele. Werk vervolgens met de inhoud van de variabele in plaats van herhaaldelijk een dure query te gebruiken.

$Users = Get-ADUser -Identity mike -Properties *

Gebruik de inhoud van de $Users variabele in plaats van de vorige opdracht meerdere keren uit te voeren. Houd er rekening mee dat de inhoud van de variabele niet wordt bijgewerkt wanneer wijzigingen worden aangebracht aan die gebruiker in Active Directory.

U kunt de $Users variabele doorsluisen om de beschikbare eigenschappen te Get-Member detecteren.

$Users | Get-Member

Selecteer vervolgens de afzonderlijke eigenschappen door door te sluisen $Users naar Select-Object, allemaal zonder dat u meer dan één keer een query op Active Directory hoeft uit te voeren.

$Users | Select-Object -Property Name, LastLogonDate, LastBadPasswordAttempt

Als u meerdere keren een query wilt uitvoeren op Active Directory, gebruikt u de parameter Eigenschappen om de gewenste niet-standaardeigenschappen op te geven.

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

Samenvatting

In dit hoofdstuk hebt u geleerd hoe u kunt bepalen welk type object een opdracht produceert, hoe u kunt bepalen welke eigenschappen en methoden beschikbaar zijn voor een opdracht en hoe u kunt werken met opdrachten die de eigenschappen beperken die standaard worden geretourneerd.

Beoordelen

  1. Welk type object produceert de Get-Process cmdlet?
  2. Hoe bepaalt u wat de beschikbare eigenschappen zijn voor een opdracht?
  3. Als er een opdracht bestaat voor het verkrijgen van iets, maar niet voor het instellen van hetzelfde, wat moet u controleren?
  4. Hoe kunnen bepaalde opdrachten die standaard geen uitvoer produceren, worden gemaakt om uitvoer te produceren?
  5. Als u gaat werken met de resultaten van een opdracht die een enorme hoeveelheid uitvoer produceert, wat moet u overwegen te doen?