Problembehandlung bei DSC

Gilt für: Windows PowerShell 4.0, Windows PowerShell 5.1

Dieser Artikel enthält Anleitungen zur Behandlung häufiger Fehler.

WinRM-Abhängigkeit

Windows PowerShell DSC (Desired State Configuration) hängt von WinRM ab. WinRM ist unter Windows Server 2008 R2 und Windows 7 nicht standardmäßig aktiviert. Führen Sie zum Aktivieren von WinRM in einer Windows PowerShell-Sitzung mit erhöhten Benutzerrechten Set-WSManQuickConfig aus.

Verwenden von „Get-DscConfigurationStatus“

Das Cmdlet Get-DscConfigurationStatus ruft Informationen zum Konfigurationsstatus von einem Zielknoten ab. Der Befehl gibt ein umfangreiches Objekt zurück, das allgemeine Informationen darüber enthält, ob die Konfigurationsausführung erfolgreich war oder nicht. Sie können das Objekt eingehender untersuchen, um Details zur Ausführung der Konfiguration zu ermitteln, wie z. B.:

  • Jede Ressource, bei der ein Fehler aufgetreten ist.
  • Jede Ressource, die einen Neustart angefordert hat.
  • Meta-Configuration Einstellungen zum Zeitpunkt der Konfigurationsausführung.

Die folgende Parametergruppe gibt die Statusinformationen zur letzten Konfigurationsausführung zurück:

Get-DscConfigurationStatus [-CimSession <CimSession[]>]
                           [-ThrottleLimit <int>]
                           [-AsJob]
                           [<CommonParameters>]

Der folgende Parametersatz gibt die status Informationen für jede Konfigurationsausführung zurück:

Get-DscConfigurationStatus -All
                           [-CimSession <CimSession[]>]
                           [-ThrottleLimit <int>]
                           [-AsJob]
                           [<CommonParameters>]

Beispiel

PS C:\> $Status = Get-DscConfigurationStatus

PS C:\> $Status

Status         StartDate                Type            Mode    RebootRequested        NumberOfResources
------        ---------                ----            ----    ---------------        -----------------
Failure        11/24/2015  3:44:56     Consistency        Push    True                36

PS C:\> $Status.ResourcesNotInDesiredState

ConfigurationName     :    MyService
DependsOn             :
ModuleName            :    PSDesiredStateConfiguration
ModuleVersion         :    1.1
PsDscRunAsCredential  :
ResourceID            :    [File]ServiceDll
SourceInfo            :    c:\git\CustomerService\Configs\MyCustomService.ps1::5::34::File
DurationInSeconds     :    0.19
Error                 :    SourcePath must be accessible for current configuration. The related file/directory is:
                           \\Server93\Shared\contosoApp.dll. The related ResourceID is [File]ServiceDll
FinalState            :
InDesiredState        :    False
InitialState          :
InstanceName          :    ServiceDll
RebootRequested       :    False
ResourceName          :    File
StartDate             :    11/24/2015  3:44:56
PSComputerName        :

Mein Skript wird nicht ausgeführt: Verwenden von DSC-Protokollen für die Diagnose von Skriptfehlern

Wie alle Windows-Software zeichnet DSC Fehler und Ereignisse in Protokollen auf, die in Ereignisanzeige zur Überprüfung zur Verfügung stehen. Die Durchsicht dieser Protokolle kann Ihnen dabei helfen herauszufinden, warum ein bestimmter Vorgang fehlgeschlagen ist und wie Sie Fehler in Zukunft vermeiden. Verwenden Sie die DSC-Protokollressource, um den Fortschritt Ihrer Konfiguration im DSC Analytic-Ereignisprotokoll nachzuverfolgen, um die Nachverfolgung von Fehlern beim Erstellen zu vereinfachen.

Wo befinden sich die DSC-Ereignisprotokolle?

In der Ereignisanzeige befinden sich DSC-Ereignisse unter: Applications and Services Logs/Microsoft/Windows/Desired State Configuration

Sie können das entsprechende PowerShell-Cmdlet Get-WinEvent ausführen, um die Ereignisprotokolle anzuzeigen:

PS C:\> Get-WinEvent -LogName "Microsoft-Windows-Dsc/Operational"

   ProviderName: Microsoft-Windows-DSC

TimeCreated                     Id LevelDisplayName Message
-----------                     -- ---------------- -------
11/17/2014 10:27:23 PM        4102 Information      Job {02C38626-D95A-47F1-9DA2-C1D44A7128E7} :

Der primäre Protokollname von DSC ist Microsoft-Windows-DSC>> (andere Protokollnamen unter Windows werden hier aus Gründen der Kürze nicht angezeigt). Der primäre Name wird an den Kanalnamen angefügt, um den vollständigen Protokollnamen zu erstellen.

Die DSC-Engine schreibt hauptsächlich in drei Arten von Protokollen: Betriebs-, Analyse- und Debugprotokolle. Da die Analyse- und Debugprotokolle standardmäßig nicht aktiviert sind, sollten Sie sie in Ereignisanzeige aktivieren. Gehen Sie dazu folgendermaßen vor:

  1. Öffnen Sie Ereignisanzeige mit einem der folgenden Optionen:

    • Show-EventLog Eingabe in Windows PowerShell
    • Klicken Sie auf die Schaltfläche Start, dann Systemsteuerung, dann Verwaltung und dann Ereignisanzeige.
  2. Wählen Sie im Menü Ansicht in der Ereignisanzeige die Option Analyse- und Debugprotokolle anzeigen aus.

    Der Protokollname für den Analysekanal ist Microsoft-Windows-Dsc/Analytic, und der Debugkanal ist Microsoft-Windows-Dsc/Debug.

Außerdem können Sie zum Aktivieren der Protokolle das Hilfsprogramm wevtutil verwenden, wie im folgenden Beispiel gezeigt.

wevtutil.exe set-log "Microsoft-Windows-Dsc/Analytic" /q:true /e:true

Oder verwenden Sie PowerShell und .NET, um die Protokolle wie im folgenden Beispiel gezeigt zu aktivieren:

$logName = 'Microsoft-Windows-Dsc/Analytic'
$log = New-Object System.Diagnostics.Eventing.Reader.EventLogConfiguration $logName
$log.IsEnabled = $true
$log.SaveChanges()

Was ist in den DSC-Protokollen enthalten?

DSC protokolliert basierend auf der Bedeutung der Nachricht drei verschiedene Protokollkanäle. Das Betriebsprotokoll in DSC enthält alle Fehlermeldungen und ist nützlich, um ein Problem zu identifizieren. Das Analyseprotokoll weist eine höhere Ereignismenge auf und kann identifizieren, wo Fehler aufgetreten sind. Dieser Kanal enthält auch alle ausgegebenen ausführlichen Nachrichten. Das Debugprotokoll enthält Protokolle, die Ihnen helfen können, zu verstehen, wie die Fehler aufgetreten sind. DSC-Ereignismeldungen beginnen mit einer Auftrags-ID, die einen DSC-Vorgang eindeutig darstellt. Im folgenden Beispiel wird versucht, die Nachricht vom ersten Ereignis abzurufen, das im operativen DSC-Protokoll angemeldet ist.

PS C:\> $AllDscOpEvents = Get-WinEvent -LogName "Microsoft-Windows-Dsc/Operational"
PS C:\> $FirstOperationalEvent = $AllDscOpEvents[0]
PS C:\> $FirstOperationalEvent.Message
Job {02C38626-D95A-47F1-9DA2-C1D44A7128E7} :
Consistency engine was run successfully.

DSC protokolliert Ereignisse mit einer Struktur, die es dem Benutzer ermöglicht, Ereignisse von einem DSC-Auftrag zu erfassen. Die Struktur sieht wie folgt aus:

Job ID : <Guid>
<Event Message>

Sammeln von Ereignissen zu einem einzelnen DSC-Vorgang

DSC-Ereignisprotokolle enthalten Ereignisse, die mithilfe verschiedener DSC-Vorgänge generiert wurden. In der Regel kümmern Sie sich jedoch um die Details für einen bestimmten Vorgang. Alle DSC-Protokolle können nach der Auftrags-ID-Eigenschaft gruppiert werden, die für jeden DSC-Vorgang eindeutig ist. Die Auftrags-ID wird als erster Eigenschaftswert in allen DSC-Ereignissen angezeigt. Die folgenden Schritte erläutern, wie Sie alle Ereignisse in einer gruppierten Arraystruktur sammeln.

<##########################################################################
 Step 1 : Enable analytic and debug DSC channels (Operational channel is enabled by default)
###########################################################################>

wevtutil.exe set-log "Microsoft-Windows-Dsc/Analytic" /q:true /e:true
wevtutil.exe set-log "Microsoft-Windows-Dsc/Debug" /q:True /e:true

<##########################################################################
 Step 2 : Perform the required DSC operation (Below is an example, you could run any DSC operation instead)
###########################################################################>

Get-DscLocalConfigurationManager

<##########################################################################
Step 3 : Collect all DSC Logs, from the Analytic, Debug and Operational channels
###########################################################################>

$DscEvents=[System.Array](Get-WinEvent "Microsoft-Windows-Dsc/Operational") `
         + [System.Array](Get-WinEvent "Microsoft-Windows-Dsc/Analytic" -Oldest) `
         + [System.Array](Get-WinEvent "Microsoft-Windows-Dsc/Debug" -Oldest)


<##########################################################################
 Step 4 : Group all logs based on the job ID
###########################################################################>
$SeparateDscOperations = $DscEvents | Group {$_.Properties[0].value}

Hier enthält die Variable $SeparateDscOperations Protokolle, die nach den Auftrags-IDs gruppiert sind. Jedes Arrayelement dieser Variablen stellt eine Gruppe von Ereignissen dar, die von einem anderen DSC-Vorgang protokolliert wurden, und ermöglicht den Zugriff auf weitere Informationen zu den Protokollen .

PS C:\> $SeparateDscOperations

Count Name                      Group
----- ----                      -----
   48 {1A776B6A-5BAC-11E3-BF... {System.Diagnostics.Eventing.Reader.EventLogRecord, System.Diagnostics....
   40 {E557E999-5BA8-11E3-BF... {System.Diagnostics.Eventing.Reader.EventLogRecord, System.Diagnostics....

PS C:\> $SeparateDscOperations[0].Group

   ProviderName: Microsoft-Windows-DSC

TimeCreated                     Id LevelDisplayName Message
-----------                     -- ---------------- -------
12/2/2013 3:47:29 PM          4115 Information      Job {1A776B6A-5BAC-11E3-BF41-00155D553612} : ...
12/2/2013 3:47:29 PM          4198 Information      Job {1A776B6A-5BAC-11E3-BF41-00155D553612} : ...
12/2/2013 3:47:29 PM          4114 Information      Job {1A776B6A-5BAC-11E3-BF41-00155D553612} : ...
12/2/2013 3:47:29 PM          4102 Information      Job {1A776B6A-5BAC-11E3-BF41-00155D553612} : ...
12/2/2013 3:47:29 PM          4098 Warning          Job {1A776B6A-5BAC-11E3-BF41-00155D553612} : ...
12/2/2013 3:47:29 PM          4098 Warning          Job {1A776B6A-5BAC-11E3-BF41-00155D553612} : ...
12/2/2013 3:47:29 PM          4176 Information      Job {1A776B6A-5BAC-11E3-BF41-00155D553612} : ...
12/2/2013 3:47:29 PM          4182 Information      Job {1A776B6A-5BAC-11E3-BF41-00155D553612} : ...
12/2/2013 3:47:29 PM          4182 Information      Job {1A776B6A-5BAC-11E3-BF41-00155D553612} : ...
12/2/2013 3:47:29 PM          4182 Information      Job {1A776B6A-5BAC-11E3-BF41-00155D553612} : ...
12/2/2013 3:47:29 PM          4182 Information      Job {1A776B6A-5BAC-11E3-BF41-00155D553612} : ...
12/2/2013 3:47:29 PM          4182 Information      Job {1A776B6A-5BAC-11E3-BF41-00155D553612} : ...
12/2/2013 3:47:29 PM          4182 Information      Job {1A776B6A-5BAC-11E3-BF41-00155D553612} : ...
12/2/2013 3:47:29 PM          4182 Information      Job {1A776B6A-5BAC-11E3-BF41-00155D553612} : ...
12/2/2013 3:47:29 PM          4182 Information      Job {1A776B6A-5BAC-11E3-BF41-00155D553612} : ...

Sie können die Daten in der Variablen $SeparateDscOperations mit Where-Object extrahieren. Im Folgenden finden Sie fünf Szenarien, in denen Sie Möglicherweise Daten für die Problembehandlung bei DSC extrahieren möchten:

1: Fehler bei Vorgängen

Alle Ereignisse verfügen über Schweregrade. Diese Informationen sind nützlich, um die Fehlerereignisse zu identifizieren:

PS C:\> $SeparateDscOperations | Where-Object {$_.Group.LevelDisplayName -contains "Error"}

Count Name                      Group
----- ----                      -----
   38 {5BCA8BE7-5BB6-11E3-BF... {System.Diagnostics.Eventing.Reader.EventLogRecord, System.Diagnostics....

2: Details zu Vorgängen, die in der letzten halben Stunde ausgeführt wurden

TimeCreated, eine Eigenschaft jedes Windows-Ereignisses, gibt den Zeitpunkt an, zu dem das Ereignis erstellt wurde. Der Vergleich dieser Eigenschaft mit einem bestimmten Datums-/Uhrzeitobjekt ist nützlich, um alle Ereignisse zu filtern:

PS C:\> $DateLatest = (Get-Date).AddMinutes(-30)
PS C:\> $SeparateDscOperations | Where-Object {$_.Group.TimeCreated -gt $DateLatest}

Count Name                      Group
----- ----                      -----
    1 {6CEC5B09-5BB0-11E3-BF... {System.Diagnostics.Eventing.Reader.EventLogRecord}

3: Meldungen zum aktuellen Vorgang

Der aktuelle Vorgang wird im ersten Index der Arraygruppe $SeparateDscOperations gespeichert. Durch Abfragen der Meldungen der Gruppe für den Index 0 werden alle Meldungen für den aktuellen Vorgang zurückgegeben:

PS C:\> $SeparateDscOperations[0].Group.Message
Job {5BCA8BE7-5BB6-11E3-BF41-00155D553612} :
Running consistency engine.
Job {1A776B6A-5BAC-11E3-BF41-00155D553612} :
Configuration is sent from computer NULL by user sid S-1-5-18.
Job {1A776B6A-5BAC-11E3-BF41-00155D553612} :
Displaying messages from built-in DSC resources:
 WMI channel 1
 ResourceID:
 Message : [INCH-VM]:                            [] Starting consistency engine.
Job {1A776B6A-5BAC-11E3-BF41-00155D553612} :
Displaying messages from built-in DSC resources:
 WMI channel 1
 ResourceID:
 Message : [INCH-VM]:                            [] Consistency check completed.

4: Fehlermeldungen, die für die letzten fehlgeschlagenen Vorgänge protokolliert wurden

$SeparateDscOperations[0].Group verfügt über den Ereignissatz für den neuesten Vorgang. Führen Sie das Cmdlet Where-Object aus, um die Ereignisse basierend auf dem Schweregrad/Anzeigenamen zu filtern. Die Ergebnisse werden in der Variablen $myFailedEvent gespeichert. Diese kann weiter zerlegt werden, um die Ereignismeldung zu erhalten:

PS C:\> $myFailedEvent = ($SeparateDscOperations[0].Group |
    Where-Object {$_.LevelDisplayName -eq "Error"})

PS C:\> $myFailedEvent.Message

Job {5BCA8BE7-5BB6-11E3-BF41-00155D553612} :
DSC Engine Error :
 Error Message Current configuration does not exist. Execute Start-DscConfiguration command with
 -Path parameter to specify a configuration file and create a current configuration first.
Error Code : 1

5: Alle Ereignisse, die für eine bestimmte Auftrags-ID generiert wurden.

$SeparateDscOperations ist ein Array von Gruppen, die jeweils den Namen als eindeutige Auftrags-ID haben. Durch Ausführen des Cmdlets Where-Object können Sie die Gruppen von Ereignissen mit einer bestimmten Auftrags-ID extrahieren:

PS C:\> ($SeparateDscOperations | Where-Object {$_.Name -eq $jobX} ).Group

   ProviderName: Microsoft-Windows-DSC

TimeCreated                     Id LevelDisplayName Message
-----------                     -- ---------------- -------
12/2/2013 4:33:24 PM          4102 Information      Job {847A5619-5BB2-11E3-BF41-00155D553612} : ...
12/2/2013 4:33:24 PM          4168 Information      Job {847A5619-5BB2-11E3-BF41-00155D553612} : ...
12/2/2013 4:33:24 PM          4146 Information      Job {847A5619-5BB2-11E3-BF41-00155D553612} : ...
12/2/2013 4:33:24 PM          4120 Information      Job {847A5619-5BB2-11E3-BF41-00155D553612} : ...

Verwenden von „xDscDiagnostics“ zum Analysieren von DSC-Protokollen

xDscDiagnostics ist ein PowerShell-Modul, das aus mehreren Funktionen besteht, die bei der Analyse von DSC-Fehlern auf dem Computer helfen können. Diese Funktionen können Ihnen helfen, alle lokalen Ereignisse aus früheren DSC-Vorgängen oder DSC-Ereignissen auf Remotecomputern zu identifizieren. Hier definiert der Begriff DSC-Vorgang eine einzelne eindeutige DSC-Ausführung vom Anfang bis zum Ende. Test-DscConfiguration wäre z. B. ein separater DSC-Vorgang. Ebenso sind alle anderen Cmdlets in DSC, z Get-DscConfiguration . B. und Start-DscConfiguration, als separate DSC-Vorgänge identifizierbar. Weitere Informationen zu den Diagnose-Funktionen finden Sie unter xDscDiagnostics.

Abrufen von Details der DSC-Vorgänge

Mit Get-xDscOperation der Funktion können Sie die Ergebnisse der DSC-Vorgänge finden, die auf einem oder mehreren Computern ausgeführt werden. Die Funktion gibt ein -Objekt zurück, das über die Auflistung von Ereignissen verfügt, die von jedem DSC-Vorgang erzeugt werden. In der folgenden Ausgabe wurden beispielsweise drei Befehle ausgeführt. Der erste wurde erfolgreich ausgeführt, bei den beiden anderen sind Fehler aufgetreten. Die Ausgabe von Get-xDscOperation fasst diese Ergebnisse zusammen.

PS C:\DiagnosticsTest> Get-xDscOperation
ComputerName   SequenceId TimeCreated           Result   JobID                                 AllEvents
------------   ---------- -----------           ------   -----                                 ---------
SRV1   1          6/23/2016 9:37:52 AM  Failure  9701aadf-395e-11e6-9165-00155d390509  {@{Message=; TimeC...
SRV1   2          6/23/2016 9:36:54 AM  Failure  7e8e2d6e-395c-11e6-9165-00155d390509  {@{Message=; TimeC...
SRV1   3          6/23/2016 9:36:54 AM  Success  af72c6aa-3960-11e6-9165-00155d390509  {@{Message=Operati...

Sie können ergebnisse nur für die neuesten Vorgänge abrufen, indem Sie den neuesten Parameter angeben:

PS C:\DiagnosticsTest> Get-xDscOperation -Newest 5
ComputerName   SequenceId TimeCreated           Result   JobID                                 AllEvents
------------   ---------- -----------           ------   -----                                 ---------
SRV1   1          6/23/2016 4:36:54 PM  Success                                        {@{Message=; TimeC...
SRV1   2          6/23/2016 4:36:54 PM  Success  5c06402b-399b-11e6-9165-00155d390509  {@{Message=Operati...
SRV1   3          6/23/2016 4:36:54 PM  Success                                        {@{Message=; TimeC...
SRV1   4          6/23/2016 4:36:54 PM  Success  5c06402a-399b-11e6-9165-00155d390509  {@{Message=Operati...
SRV1   5          6/23/2016 4:36:51 PM  Success                                        {@{Message=; TimeC...

Abrufen von Details der DSC-Ereignisse

Das Cmdlet Trace-xDscOperation gibt ein Objekt zurück, das eine Sammlung von Ereignissen, deren Ereignistypen und die von einem bestimmten DSC-Vorgang generierte Meldungsausgabe enthält. Wenn Sie einen Fehler in einem der Vorgänge mit Get-xDscOperationfinden, werden Sie diesen Vorgang in der Regel nachverfolgen, um die Ereignisse zu finden, die einen Fehler verursacht haben.

Verwenden Sie den Parameter SequenceID, um die Ereignisse eines bestimmten Vorgangs auf einem bestimmten Computer abzurufen. Wenn Sie beispielsweise für SequenceID „9“ angeben, ruft Trace-xDscOperation die Verfolgung des neuntletzten DSC-Vorgangs ab:

PS C:\DiagnosticsTest> Trace-xDscOperation -SequenceID 9
ComputerName   EventType    TimeCreated           Message
------------   ---------    -----------           -------
SRV1   OPERATIONAL  6/24/2016 10:51:52 AM Operation Consistency Check or Pull started by user sid S-1-5-20 from computer NULL.
SRV1   OPERATIONAL  6/24/2016 10:51:52 AM Running consistency engine.
SRV1   OPERATIONAL  6/24/2016 10:51:52 AM The local configuration manager is updating the PSModulePath to WindowsPowerShell\Modules;C:\Prog...
SRV1   OPERATIONAL  6/24/2016 10:51:53 AM  Resource execution sequence :: [WindowsFeature]DSCServiceFeature, [xDSCWebService]PSDSCPullServer.
SRV1   OPERATIONAL  6/24/2016 10:51:54 AM Consistency engine was run successfully.
SRV1   OPERATIONAL  6/24/2016 10:51:54 AM Job runs under the following LCM setting. ...
SRV1   OPERATIONAL  6/24/2016 10:51:54 AM Operation Consistency Check or Pull completed successfully.

Übergeben Sie die einem bestimmten DSC-Vorgang zugeordnete GUID (wie vom Cmdlet Get-xDscOperation zurückgegeben), um die Ereignisdetails für diesen DSC-Vorgang abzurufen:

PS C:\DiagnosticsTest> Trace-xDscOperation -JobID 9e0bfb6b-3a3a-11e6-9165-00155d390509

ComputerName   EventType    TimeCreated           Message
------------   ---------    -----------           -------
SRV1   OPERATIONAL  6/24/2016 11:36:56 AM Operation Consistency Check or Pull started by user sid S-1-5-20 from computer NULL.
SRV1   ANALYTIC     6/24/2016 11:36:56 AM Deleting file from C:\Windows\System32\Configuration\DSCEngineCache.mof
SRV1   OPERATIONAL  6/24/2016 11:36:56 AM Running consistency engine.
SRV1   VERBOSE      6/24/2016 11:36:56 AM [SRV1]:                            [] Starting consistency engine.
SRV1   ANALYTIC     6/24/2016 11:36:56 AM Applying configuration from C:\Windows\System32\Configuration\Current.mof.
SRV1   ANALYTIC     6/24/2016 11:36:56 AM Parsing the configuration to apply.
SRV1   OPERATIONAL  6/24/2016 11:36:56 AM  Resource execution sequence :: [WindowsFeature]DSCServiceFeature, [xDSCWebService]PSDSCPullServer.
SRV1   VERBOSE      6/24/2016 11:36:56 AM [SRV1]: LCM:  [ Start  Resource ]  [[WindowsFeature]DSCServiceFeature]
SRV1   ANALYTIC     6/24/2016 11:36:56 AM Executing operations for PS DSC resource MSFT_RoleResource with resource name [WindowsFeature]DSC...
SRV1   VERBOSE      6/24/2016 11:36:56 AM [SRV1]: LCM:  [ Start  Test     ]  [[WindowsFeature]DSCServiceFeature]
SRV1   VERBOSE      6/24/2016 11:36:56 AM [SRV1]:                            [[WindowsFeature]DSCServiceFeature] The operation 'Get...
SRV1   VERBOSE      6/24/2016 11:36:56 AM [SRV1]:                            [[WindowsFeature]DSCServiceFeature] The operation 'Get...
SRV1   VERBOSE      6/24/2016 11:36:56 AM [SRV1]: LCM:  [ End    Test     ]  [[WindowsFeature]DSCServiceFeature] True in 0.3130 sec...
SRV1   VERBOSE      6/24/2016 11:36:56 AM [SRV1]: LCM:  [ End    Resource ]  [[WindowsFeature]DSCServiceFeature]
SRV1   VERBOSE      6/24/2016 11:36:56 AM [SRV1]: LCM:  [ Start  Resource ]  [[xDSCWebService]PSDSCPullServer]
SRV1   ANALYTIC     6/24/2016 11:36:56 AM Executing operations for PS DSC resource MSFT_xDSCWebService with resource name [xDSCWebService]P...
SRV1   VERBOSE      6/24/2016 11:36:56 AM [SRV1]: LCM:  [ Start  Test     ]  [[xDSCWebService]PSDSCPullServer]
SRV1   VERBOSE      6/24/2016 11:36:56 AM [SRV1]:                            [[xDSCWebService]PSDSCPullServer] Check Ensure
SRV1   VERBOSE      6/24/2016 11:36:56 AM [SRV1]:                            [[xDSCWebService]PSDSCPullServer] Check Port
SRV1   VERBOSE      6/24/2016 11:36:56 AM [SRV1]:                            [[xDSCWebService]PSDSCPullServer] Check Physical Path ...
SRV1   VERBOSE      6/24/2016 11:36:56 AM [SRV1]:                            [[xDSCWebService]PSDSCPullServer] Check State
SRV1   VERBOSE      6/24/2016 11:36:56 AM [SRV1]:                            [[xDSCWebService]PSDSCPullServer] Get Full Path for We...
SRV1   VERBOSE      6/24/2016 11:36:56 AM [SRV1]: LCM:  [ End    Test     ]  [[xDSCWebService]PSDSCPullServer] True in 0.0160 seconds.
SRV1   VERBOSE      6/24/2016 11:36:56 AM [SRV1]: LCM:  [ End    Resource ]  [[xDSCWebService]PSDSCPullServer]
SRV1   VERBOSE      6/24/2016 11:36:56 AM [SRV1]:                            [] Consistency check completed.
SRV1   ANALYTIC     6/24/2016 11:36:56 AM Deleting file from C:\Windows\System32\Configuration\DSCEngineCache.mof
SRV1   OPERATIONAL  6/24/2016 11:36:56 AM Consistency engine was run successfully.
SRV1   OPERATIONAL  6/24/2016 11:36:56 AM Job runs under the following LCM setting. ...
SRV1   OPERATIONAL  6/24/2016 11:36:56 AM Operation Consistency Check or Pull completed successfully.
SRV1   ANALYTIC     6/24/2016 11:36:56 AM Deleting file from C:\Windows\System32\Configuration\DSCEngineCache.mof

Beachten Sie, dass Sie aufgefordert werden, diese Protokolle zu aktivieren, da Trace-xDscOperation Ereignisse aus den Protokollen Analyse, Debuggen und Betriebsprotokollen aggregiert werden.

Informationen zu den Ereignissen können Sie alternativ auch sammeln, indem Sie die Ausgabe von Trace-xDscOperation in einer Variablen speichern. Verwenden Sie die folgenden Befehle, um alle Ereignisse für einen bestimmten DSC-Vorgang anzuzeigen.

PS C:\DiagnosticsTest> $Trace = Trace-xDscOperation -SequenceID 4

PS C:\DiagnosticsTest> $Trace.Event

Dadurch werden die gleichen Ergebnisse wie das Get-WinEvent Cmdlet angezeigt, z. B. in der folgenden Ausgabe:

   ProviderName: Microsoft-Windows-DSC

TimeCreated                     Id LevelDisplayName Message
-----------                     -- ---------------- -------
6/23/2016 1:36:53 AM          4312 Information      The DscTimer is running LCM method PerformRequiredConfigurationChecks with the flag set to 5.
6/23/2016 1:36:53 AM          4343 Information      The DscTimer has successfully run LCM method PerformRequiredConfigurationChecks with flag 5.
6/23/2016 2:07:00 AM          4312 Information      The DscTimer is running LCM method PerformRequiredConfigurationChecks with the flag set to 5.
6/23/2016 2:07:01 AM          4343 Information      The DscTimer has successfully run LCM method PerformRequiredConfigurationChecks with flag 5.
6/23/2016 2:36:55 AM          4312 Information      The DscTimer is running LCM method PerformRequiredConfigurationChecks with the flag set to 5.
6/23/2016 2:36:56 AM          4343 Information      The DscTimer has successfully run LCM method PerformRequiredConfigurationChecks with flag 5.
6/23/2016 3:06:55 AM          4312 Information      The DscTimer is running LCM method PerformRequiredConfigurationChecks with the flag set to 5.
6/23/2016 3:06:55 AM          4343 Information      The DscTimer has successfully run LCM method PerformRequiredConfigurationChecks with flag 5.
6/23/2016 3:36:55 AM          4312 Information      The DscTimer is running LCM method PerformRequiredConfigurationChecks with the flag set to 5.
6/23/2016 3:36:55 AM          4343 Information      The DscTimer has successfully run LCM method PerformRequiredConfigurationChecks with flag 5.
6/23/2016 4:06:53 AM          4312 Information      The DscTimer is running LCM method PerformRequiredConfigurationChecks with the flag set to 5.
6/23/2016 4:06:53 AM          4343 Information      The DscTimer has successfully run LCM method PerformRequiredConfigurationChecks with flag 5.
6/23/2016 4:36:52 AM          4312 Information      The DscTimer is running LCM method PerformRequiredConfigurationChecks with the flag set to 5.
6/23/2016 4:36:53 AM          4343 Information      The DscTimer has successfully run LCM method PerformRequiredConfigurationChecks with flag 5.
6/23/2016 5:06:52 AM          4312 Information      The DscTimer is running LCM method PerformRequiredConfigurationChecks with the flag set to 5.
6/23/2016 5:06:53 AM          4343 Information      The DscTimer has successfully run LCM method PerformRequiredConfigurationChecks with flag 5.
6/23/2016 5:36:54 AM          4312 Information      The DscTimer is running LCM method PerformRequiredConfigurationChecks with the flag set to 5.
6/23/2016 5:36:54 AM          4343 Information      The DscTimer has successfully run LCM method PerformRequiredConfigurationChecks with flag 5.
6/23/2016 6:06:52 AM          4312 Information      The DscTimer is running LCM method PerformRequiredConfigurationChecks with the flag set to 5.
6/23/2016 6:06:53 AM          4343 Information      The DscTimer has successfully run LCM method PerformRequiredConfigurationChecks with flag 5.
6/23/2016 6:36:56 AM          4312 Information      The DscTimer is running LCM method PerformRequiredConfigurationChecks with the flag set to 5.
6/23/2016 6:36:57 AM          4343 Information      The DscTimer has successfully run LCM method PerformRequiredConfigurationChecks with flag 5.
6/23/2016 7:06:52 AM          4312 Information      The DscTimer is running LCM method PerformRequiredConfigurationChecks with the flag set to 5.
6/23/2016 7:06:53 AM          4343 Information      The DscTimer has successfully run LCM method PerformRequiredConfigurationChecks with flag 5.
6/23/2016 7:36:53 AM          4312 Information      The DscTimer is running LCM method PerformRequiredConfigurationChecks with the flag set to 5.
6/23/2016 7:36:54 AM          4343 Information      The DscTimer has successfully run LCM method PerformRequiredConfigurationChecks with flag 5.
6/23/2016 8:06:54 AM          4312 Information      The DscTimer is running LCM method PerformRequiredConfigurationChecks with the flag set to 5.

Im Idealfall würden Sie zuerst Get-xDscOperation verwenden, um die letzten DSC-Konfigurationsausführungen auf Ihren Computern aufzulisten. Anschließend können Sie jeden einzelnen Vorgang untersuchen, indem Sie seine SequenceID oder JobID mit Trace-xDscOperation angeben, um zu ermitteln, was er im Hintergrund getan hat.

Abrufen von Ereignissen für einen Remotecomputer

Verwenden Sie den Parameter ComputerName des Cmdlets Trace-xDscOperation, um Details von Ereignissen abzurufen, die auf einem Remotecomputer auftreten. Zuvor müssen Sie eine Firewallregel erstellen, um die Remoteverwaltung auf dem Remotecomputer zu erlauben:

New-NetFirewallRule -Name "Service RemoteAdmin" -DisplayName "Remote" -Action Allow

Nun können Sie diesen Computer angeben, wenn Sie Trace-xDscOperation aufrufen:

Trace-xDscOperation -ComputerName SRV2 -Credential Get-Credential -SequenceID 5
ComputerName   EventType    TimeCreated           Message
------------   ---------    -----------           -------
SRV2   OPERATIONAL  6/24/2016 11:36:56 AM Operation Consistency Check or Pull started by user sid S-1-5-20 f...
SRV2   ANALYTIC     6/24/2016 11:36:56 AM Deleting file from C:\Windows\System32\Configuration\DSCEngineCach...
SRV2   OPERATIONAL  6/24/2016 11:36:56 AM Running consistency engine.
SRV2   VERBOSE      6/24/2016 11:36:56 AM [SRV2]:                            [] Starting consistency...
SRV2   ANALYTIC     6/24/2016 11:36:56 AM Applying configuration from C:\Windows\System32\Configuration\Curr...
SRV2   ANALYTIC     6/24/2016 11:36:56 AM Parsing the configuration to apply.
SRV2   OPERATIONAL  6/24/2016 11:36:56 AM  Resource execution sequence :: [WindowsFeature]DSCServiceFeature,...
SRV2   VERBOSE      6/24/2016 11:36:56 AM [SRV2]: LCM:  [ Start  Resource ]  [[WindowsFeature]DSCSer...
SRV2   ANALYTIC     6/24/2016 11:36:56 AM Executing operations for PS DSC resource MSFT_RoleResource with re...
SRV2   VERBOSE      6/24/2016 11:36:56 AM [SRV2]: LCM:  [ Start  Test     ]  [[WindowsFeature]DSCSer...
SRV2   VERBOSE      6/24/2016 11:36:56 AM [SRV2]:                            [[WindowsFeature]DSCSer...
SRV2   VERBOSE      6/24/2016 11:36:56 AM [SRV2]:                            [[WindowsFeature]DSCSer...
SRV2   VERBOSE      6/24/2016 11:36:56 AM [SRV2]: LCM:  [ End    Test     ]  [[WindowsFeature]DSCSer...
SRV2   VERBOSE      6/24/2016 11:36:56 AM [SRV2]: LCM:  [ End    Resource ]  [[WindowsFeature]DSCSer...
SRV2   VERBOSE      6/24/2016 11:36:56 AM [SRV2]: LCM:  [ Start  Resource ]  [[xDSCWebService]PSDSCP...
SRV2   ANALYTIC     6/24/2016 11:36:56 AM Executing operations for PS DSC resource MSFT_xDSCWebService with ...
SRV2   VERBOSE      6/24/2016 11:36:56 AM [SRV2]: LCM:  [ Start  Test     ]  [[xDSCWebService]PSDSCP...
SRV2   VERBOSE      6/24/2016 11:36:56 AM [SRV2]:                            [[xDSCWebService]PSDSCP...
SRV2   VERBOSE      6/24/2016 11:36:56 AM [SRV2]:                            [[xDSCWebService]PSDSCP...
SRV2   VERBOSE      6/24/2016 11:36:56 AM [SRV2]:                            [[xDSCWebService]PSDSCP...
SRV2   VERBOSE      6/24/2016 11:36:56 AM [SRV2]:                            [[xDSCWebService]PSDSCP...
SRV2   VERBOSE      6/24/2016 11:36:56 AM [SRV2]:                            [[xDSCWebService]PSDSCP...
SRV2   VERBOSE      6/24/2016 11:36:56 AM [SRV2]: LCM:  [ End    Test     ]  [[xDSCWebService]PSDSCP...
SRV2   VERBOSE      6/24/2016 11:36:56 AM [SRV2]: LCM:  [ End    Resource ]  [[xDSCWebService]PSDSCP...
SRV2   VERBOSE      6/24/2016 11:36:56 AM [SRV2]:                            [] Consistency check co...
SRV2   ANALYTIC     6/24/2016 11:36:56 AM Deleting file from C:\Windows\System32\Configuration\DSCEngineCach...
SRV2   OPERATIONAL  6/24/2016 11:36:56 AM Consistency engine was run successfully.
SRV2   OPERATIONAL  6/24/2016 11:36:56 AM Job runs under the following LCM setting. ...
SRV2   OPERATIONAL  6/24/2016 11:36:56 AM Operation Consistency Check or Pull completed successfully.
SRV2   ANALYTIC     6/24/2016 11:36:56 AM Deleting file from C:\Windows\System32\Configuration\DSCEngineCach...

Meine Ressourcen werden nicht aktualisiert: Zurücksetzen des Caches

Die DSC-Engine speichert Ressourcen zwischen, die aus Effizienzgründen als PowerShell-Engine implementiert wurden. Dies kann jedoch zu Problemen führen, wenn Sie eine Ressource erstellen und gleichzeitig testen, da DSC die zwischengespeicherte Version lädt, bis der Prozess neu gestartet wird. Die einzige Möglichkeit, DSC zu veranlassen, die neuere Version zu laden, besteht darin, den Prozess, der die DSC-Engine hostet, explizit zu beenden.

Ebenso kann die Änderung beim Ausführen Start-DscConfigurationvon nach dem Hinzufügen und Ändern einer benutzerdefinierten Ressource nur ausgeführt werden, wenn oder bis der Computer neu gestartet wird. Dies liegt daran, dass DSC im WMI-Anbieterhostprozess (WmiPrvSE) ausgeführt wird und in der Regel viele Instanzen von WmiPrvSE gleichzeitig ausgeführt werden. Beim Neustart wird der Hostprozess neu gestartet und der Cache gelöscht.

Um die Konfiguration erfolgreich zu recyceln und den Cache zu löschen, ohne einen Neustart auszuführen, müssen Sie den Hostprozess beenden und neu starten. Dies kann auf instance Basis erfolgen, wobei Sie den Prozess identifizieren, beenden und neu starten. Sie können auch DebugMode verwenden, wie nachfolgend gezeigt, um die PowerShell DSC-Ressource erneut zu laden.

Um den Prozess zu identifizieren, der die DSC-Engine hosten soll, listen Sie die Prozess-ID der WmiPrvSEauf, die die DSC-Engine hosten. Um den Anbieter zu aktualisieren, beenden Sie den WmiPrvSE Prozess mithilfe der folgenden Befehle, und führen Sie dann erneut aus Start-DscConfiguration .

###
### find the process that is hosting the DSC engine
###
$CimParameters = @{
    ClassName = 'Msft_Providers'
    Filter    = "provider='dsctimer' OR provider='dsccore'"
}
$dscProcessID = Get-CimInstance @CimParameters |
    Select-Object -ExpandProperty HostProcessIdentifier

###
### Stop the process
###
Get-Process -Id $dscProcessID | Stop-Process

Verwenden von DebugMode

Sie können den lokalen Konfigurations-Manager (LCM) von DSC für die Verwendung von DebugMode konfigurieren, damit der Cache bei jedem Neustart des Hostprozesses neu gestartet wird. Bei Festlegung auf $truewird die PowerShell DSC-Ressource von der Engine immer neu geladen. Sobald Sie mit dem Schreiben Ihrer Ressource fertig sind, können Sie sie wieder auf $false festlegen, und die Engine setzt wieder auf das Verhalten der Zwischenspeicherung der Module zurück.

In der folgenden Demonstration wird verdeutlicht, wie DebugMode den Cache automatisch aktualisieren kann. Betrachten wir zunächst die Standardkonfiguration:

Get-DscLocalConfigurationManager
AllowModuleOverwrite           : False
CertificateID                  :
ConfigurationID                :
ConfigurationMode              : ApplyAndMonitor
ConfigurationModeFrequencyMins : 30
Credential                     :
DebugMode                      : {None}
DownloadManagerCustomData      :
DownloadManagerName            :
LocalConfigurationManagerState : Ready
RebootNodeIfNeeded             : False
RefreshFrequencyMins           : 15
RefreshMode                    : PUSH
PSComputerName                 :

Sie können sehen, dass DebugMode ist None.

Zum Einrichten der DebugMode-Demo verwenden Sie die folgenden PowerShell-Ressource:

function Get-TargetResource {
    param (
        [Parameter(Mandatory)] $onlyProperty
    )

    $Path = "$env:SystemDrive\OutputFromTestProviderDebugMode.txt"

    return @{
        onlyProperty = Get-Content -Path $Path
    }
}
function Set-TargetResource {
    param (
        [Parameter(Mandatory)] $onlyProperty
    )

    "1" | Out-File -PSPath "$env:SystemDrive\OutputFromTestProviderDebugMode.txt"
}
function Test-TargetResource {
    param (
        [Parameter(Mandatory)]
        $onlyProperty
    )

    return $false
}

Erstellen Sie nun eine Konfiguration mit dem Namen TestProviderDebugMode:

Configuration ConfigTestDebugMode
{
    Import-DscResource -Name TestProviderDebugMode
    Node localhost
    {
        TestProviderDebugMode test
        {
            onlyProperty = "blah"
        }
    }
}
ConfigTestDebugMode

Der Inhalt der Datei $env:SystemDrive\OutputFromTestProviderDebugMode.txt ist 1.

Aktualisieren Sie nun den Anbietercode mithilfe des folgenden Skripts:

$newResourceOutput = Get-Random -Minimum 5 -Maximum 30
$OutputPath = "C:\Program Files\WindowsPowerShell\Modules\MyPowerShellModules\DSCResources\TestProviderDebugMode\TestProviderDebugMode.psm1"
$content = @"
function Get-TargetResource {
    param (
        [Parameter(Mandatory)] `$onlyProperty
    )

    `$Path = "$env:SystemDrive\OutputFromTestProviderDebugMode.txt"
    return @{
        onlyProperty = Get-Content -Path $Path
    }
}
function Set-TargetResource {
    param (
        [Parameter(Mandatory)] `$onlyProperty
    )

    "$newResourceOutput" | Out-File -PSPath C:\OutputFromTestProviderDebugMode.txt
}
function Test-TargetResource {
    param (
        [Parameter(Mandatory)] `$onlyProperty
    )

    return `$false
}
"@ | Out-File -FilePath $OutputPath

Dieses Skript generiert eine Zufallszahl und aktualisiert den Anbietercode. Wenn DebugMode auf FALSE festgelegt ist, wird der Inhalt der Datei $env:SystemDrive\OutputFromTestProviderDebugMode.txt nie geändert.

Legen Sie DebugMode nun in Ihrem Konfigurationsskript auf ForceModuleImport fest:

LocalConfigurationManager
{
    DebugMode = "ForceModuleImport"
}

Wenn Sie das Skript erneut ausführen, beachten Sie, dass der Inhalt der Datei jedes Mal anders ist. Sie können ausführen Get-DscConfiguration , um es zu überprüfen. Der folgende Codeausschnitt zeigt das Ergebnis von zwei weiteren Ausführungen. Ihre Ergebnisse können sich unterscheiden, wenn Sie das Skript ausführen.

PS C:\> Get-DscConfiguration -CimSession (New-CimSession localhost)

onlyProperty                            PSComputerName
------------                            --------------
20                                      localhost

PS C:\> Get-DscConfiguration -CimSession (New-CimSession localhost)

onlyProperty                            PSComputerName
------------                            --------------
14                                      localhost

DSC gibt bei der Registrierung bei Windows-Pullserver „Unerwarteter Antwortcode – InternalServerError“ zurück.

Wenn Sie eine Metakonfiguration auf einen Server anwenden, um ihn bei einer instance von Windows Pull Server zu registrieren, wird möglicherweise der folgende Fehler angezeigt.

Registration of the Dsc Agent with the server https://<serverfqdn>:8080/PSDSCPullServer.svc failed. The underlying error is: The attempt to register Dsc Agent with AgentId <ID> with the server
https://<serverfqdn>:8080/PSDSCPullServer.svc/Nodes(AgentId='<ID>') returned unexpected response code InternalServerError. .
    + CategoryInfo          : InvalidResult: (root/Microsoft/...gurationManager:String) [], CimException
    + FullyQualifiedErrorId : RegisterDscAgentUnsuccessful,Microsoft.PowerShell.DesiredStateConfiguration.Commands.RegisterDscAgentCommand
    + PSComputerName        : <computername>

Dies kann auftreten, wenn das Zertifikat, das auf dem Server zum Verschlüsseln des Datenverkehrs verwendet wird, einen allgemeinen Namen (Common Name, CN) aufweist, der sich von dem DNS-Namen unterscheidet, der vom Knoten zum Auflösen der URL verwendet wird. Aktualisieren Sie die Windows-Pullserver-Instanz, sodass ein Zertifikat mit einem korrigierten Namen verwendet wird.

Fehler beim Ausführen von Sysprep nach dem Anwenden einer DSC-Konfiguration

Wenn Sie versuchen, Sysprep auszuführen, um einen Windows Server nach dem Anwenden einer DSC-Konfiguration zu generalisieren, erhalten Sie möglicherweise den folgenden Fehler.

SYSPRP LaunchDll:Failure occurred while executing 'DscCore.dll,SysPrep_Cleanup', returned error code 0x2

Das Generalisieren eines Servers nach der Konfiguration mit Windows PowerShell Desired State Configuration ist kein unterstütztes Szenario. Wenden Sie stattdessen erst Konfigurationen auf Windows an, nachdem die Phase „Specialize“ (Spezialisierung) des Windows-Setups abgeschlossen ist.

Weitere Informationen

Konzepte

Weitere Ressourcen