doskias
Goto Top

Fehler abfangen im PS Skript

Hallo Schwarmintelligenz face-smile

Situation vorweg: Wir haben in unregelmäßigen Abständen ein auftretendes Problem. Dies Problem trifft nicht alle Anwender gleichzeitig und auch nicht immer die gleichen, denn das wäre ja zu einfach. Bei meiner Suche bin ich darauf gekommen, dass das Problem nur auftritt, wenn im Systemlog eine gewisse InstanceID auftritt. Allerdings ist dies nur ein Indiz und keine hinreichende Bedingung. Sprich: Wenn der Fehler auftritt, dann existiert die Meldung im Systemlog, wenn die Meldung aber da ist, dann muss der Fehler nicht zwingend auftreten. Also habe ich mir ein PS-Skript erstellt mit der Idee es bei Bedarf zu starten um die laufenden Rechner zu ermitteln, die in den vergangenen 24 Stunden ebenfalls die InstanceID protokolliert haben. Ausgeführt wird das ganze auf einem DC mit Adminrechten. Hier nun das Skript:

Write-output (get-date) > c:\temp\8021.log
Write-output (get-date) > c:\temp\8021_error.log
$Verzeichnis= "OU=PCs,DC=Domain,DC=LOCAL"  

cls
# Rechner ermitteln
$Gruppe_Status=Get-ADComputer -filter * -properties Name,IPv4Address,OperatingSystem -SearchBase $Verzeichnis

#Rechner einzeln durchgehen

foreach ($PC in $Gruppe_Status)
{
# Online-Status abfragen
$Check_Status=test-connection $PC.name -count 1 -quiet

#Wenn Online, dann...
if($check_status -eq 1)
    {
    Write-Output $pc.Name
        $Ergebnis=invoke-command $PC.name {
        $Datum=(get-date).Adddays(-1).ToString("dd.MM.yyyy")  
        Get-EventLog -LogName system -after $Datum -InstanceId 2147491669 |Select-Object -Property timewritten
        }
        Write-Output "" >> c:\temp\8021.log  
        Write-Output $pc.Name >> c:\temp\8021.log
        Write-Output $Ergebnis >> c:\temp\8021.log
        #Write-Error $ergebnis >> c:\temp\8021_error.log
     }
            
}
Write-output (get-date) >> c:\temp\8021.txt

An sich funktioniert das Skript. Es gibt jedoch 4 Dinge die mir in dem Skript zu schaffen machen.

1: Das ganze müsste sich auch ohne invoke-command ermitteln lassen können. Dazu sollte der Befehl
get-eventlog -LogName system -computername $pc.Name -after $Datum -InstanceId 2147491669 |Select-Object -Property timewritten
ausreichend sein. Dieser führt jedoch zu der Meldung, dass der Netzwerkpfad zu dem Computer nicht gefunden werden konnte. Es liegt auch nicht an der Variablen, sondern am Rechner. Wenn ich den get-eventlog-Befehl auf meinem Rechner unter den gleichem Benutzer ausführe, dann funktioniert es. Woran liegt das?

2: Wenn ich das Skript in dem Zustand ausführe, dann bekomme ich gelegentlich die Meldung:
Fehler beim Ausführen des InitializeDefaultDrives-Vorgangs für den Anbieter "FileSystem".
Es sind immer die gleichen Rechte. Ich habe noch nicht ganz verstanden welche Einstellung hier ursächlich für die Fehlermeldung ist. ich bekomme die Meldung sowohl auf Windows 8 Rechner als auch auf Windows 10 Rechnern. Auffällig hier ist, dass alle Windows 10 Rechner vom gleichen Image installiert wurden, den gleichen Patchstand haben und die gleichen GPOs erhalten. Die User auf den Rechnern haben alle die gleichen Berechtigungen, keine lokalen Adminrechte. Es trifft nicht alle von dem Image installierten Rechnern. Meine ergoogelten Recherchen brachten keine Abhilfe. Das Skript funktioniert dann allerdings dennoch. Wie kann ich die Ursache dafür beheben?

3: Wenn das Ereignis schonmal aufgetreten ist, es aber länger als 24 Stunden her ist, dann ist mein $Ergebnis einfach leer. Damit kann ich gut leben. Wenn das Ereignis allerdings noch nie aufgetreten ist, dann bekomme ich die Meldung, dass keine Übereinstimmung gefunden wurde. Ansicht kein Fehler aber eine Meldung, die mich an der Stelle nicht interessiert. Wie kann ich diese Meldung unterdrücken?

4: Ich habe versucht mit Write-Error die unter Punkt 2 genannten Meldung separat zu protokollieren. Das funktioniert allerdings nicht. Es wird immer nur die unter Punkt 3 erzeugte "Keine Übereinstimmung"-Nachricht Protokolliert.

Gruß
Doskias

Content-ID: 642034

Url: https://administrator.de/forum/fehler-abfangen-im-ps-skript-642034.html

Ausgedruckt am: 22.12.2024 um 08:12 Uhr

147323
147323 19.01.2021 aktualisiert um 10:54:34 Uhr
Goto Top
Statt dem reinen "Namen" würde ich hier immer den DNSHostNamen oder IP-Adresse für den Zugriff benutzen.
Fehler beim Ausführen des InitializeDefaultDrives-Vorgangs für den Anbieter "FileSystem".
Stichwort "Powershell Profil laden verhindern".
Wie kann ich diese Meldung unterdrücken?
Stichwort Try{}Catch{}Finally
LeeX01
Lösung LeeX01 19.01.2021 um 10:55:39 Uhr
Goto Top
Dafür ist es nötig dass der Service Remote Registry auf den Zielsystemen gestartet ist. Hast du das sichergestellt?
Doskias
Doskias 19.01.2021 um 11:19:00 Uhr
Goto Top
Und das bezieht sich jetzt auf welchen Punkt genau?
LeeX01
LeeX01 19.01.2021 um 11:27:53 Uhr
Goto Top
Zitat von @Doskias:

Und das bezieht sich jetzt auf welchen Punkt genau?

Meinst du mich?

Auf den Punkt 1
Doskias
Doskias 19.01.2021 um 15:02:32 Uhr
Goto Top
Zitat von @LeeX01:
Dafür ist es nötig dass der Service Remote Registry auf den Zielsystemen gestartet ist. Hast du das sichergestellt?

So nachdem ich jetzt einen Konflikt mit zwei sich widersprechenden GPOs gefunden habe, die sich genau um den Dienst drehen habe ich das jetzt Sichergestellt. Es funktioniert nun. Allerdings bin ich doch etwas verwundert. Es sind 87 Rechner in der betroffenen OU
Get-EventLog -LogName system -computername $pc.DNSHostName -after $Datum -InstanceId 2147491669 -ErrorAction SilentlyContinue|Select-Object -Property timewritten >> c:\temp\8021.log
benötigt für die ersten 29 Rechner genau 10 Minuten, während
$Ergebnis=invoke-command $PC.DNSHostName {
$Datum=(get-date).Adddays(-1).ToString("dd.MM.yyyy")  
Get-EventLog -LogName system -after $Datum -InstanceId 2147491669 -ErrorAction SilentlyContinue|Select-Object -Property timewritten}
das ganze in 5 Minuten.

Denke auf Grund des zeitlichen Aspektes bleibe ich beim invoke-Command.

Punkt 1 ist damit dennoch erledigt.

Punkt 2 was @147323 schreibt habe ich allerdings nicht ganz verstanden. Ich habe die Einstellungen noch einmal geprüft und nur 12 der 87 Rechner haben das "Problem". Die Execution-Policyist dort identisch. zwei der 87 Rechner sind neu. Einer von Freitag, einer von Montag. Der von Freitag hat das Problem, der vom Montag nicht. Da Sie wie gesagt vom gleich Image erstellt wurden und bis auf den Namen identisch konfiguriert sind, erschließt sich mir die Ursache nicht.

Punkt 3: habe ich ebenfalls mit try - catch - finally erfolglos versucht. Habe jetzt einfach den Parameter -errorAction SilentContinue benutzt. Für dieses zweck geht es. Werde mir try - catch -finally in einer ruhigen Minute noch einmal genau ansehen.

Punkt 4 hat sich mit dem silentContinue eigentlich erledigt. Zur Protokollierung der Fehler prüfe ich nach jedem Durchgang $error ob dort "Netzwerkpfad" enthalten ist, werte dies aus und schreibe es in eine Datei.

Punkte 1,3 und 4 sind damit erledigt. Punkt 2 ist noch offen, deswegen markiere ich die Frage noch nicht als gelöst.