Fehler abfangen im PS Skript
Hallo Schwarmintelligenz
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:
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 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:
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
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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 642034
Url: https://administrator.de/contentid/642034
Ausgedruckt am: 18.11.2024 um 06:11 Uhr
5 Kommentare
Neuester Kommentar
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{}FinallyMeinst du mich?
Auf den Punkt 1