Niemand wir Dir ohne Zugriff auf Dein System sagen können was da startet.
Dem Problem begegne ich regelmäßig im PC-Reperaturbetrieb...
Eigentlich ist es relativ einfach Progammstart/-ende zu loggen. Jedoch nicht beim Booten/Login. Dafür muss man den "Beobachter" unter den betreffenden Vorgang schieben noch bevor dieser startet.
Im Falle des User-Logins und dessen Autostartroutinen ist es relativ einfach.
Man leitet einfach den Start des Desktops auf ein anderes Programm/Script um, indem unter dem Registryschlüssel "HKCU\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" im Wert "Shell" eine eigene Startroutine definiert wird. (existiert der Wert Shell nicht wird der Explorer gestartet)
Hier ein kleines Powershell-Batch-Hybrid, welches diese Umleitung auf sich selbst einrichtet und beim nächsten Login alle Progammstarts/-beendigungen anzeigt und speichert.
Die Batch logt den Nutzer nach der Änderung des Shell-Eintrags automatisch aus. Beim erneuten Login wird die Batch/Powershellscript noch vor dem Start der Explorers ausgeführt und die Shellumleitung automatisch entfernt. damit ist alles wieder wie es sein soll. Im Fenster des Powershellscripts wird angezeigt was passiert.
ProcWatcher.ps1.cmd
<# : Begin of batch section and Powershell comment
@echo off
pushd "%~dp0"
set "thisPath=%~f0"
rem wenn eine alternative Shell-definition vorhanden ist...:
for /f "tokens=*" %%a in ('reg query "HKCU\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v "Shell" 2^>nul ^|find "Shell"') do (
reg delete "HKCU\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v "Shell" /f >nul 2>&1 &rem lösche die Shellumleitung
start "ProcessWatcher" powershell "&([Scriptblock]::Create((gc '%thisPath%' -enc UTF8 -raw )))" &rem führe diese Datei in Powershell aus
exit /b
)
rem wenn nicht...
:init
reg add "HKCU\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v "Shell" /d "cmd /c \"%thisPath%\" &timeout 2& start explorer.exe" /f >nul 2>&1 &rem Shellumleitung in Registry eintragen.
shutdown /l /f &rem Logoff
exit /b
: End of batch section and Powershell comment#>
$queryProcessStart = "SELECT * FROM __InstanceCreationEvent WITHIN 0.1 WHERE TargetInstance ISA 'Win32_Process'"
$queryProcessClose = "SELECT * FROM __InstanceDeletionEvent WITHIN 0.1 WHERE TargetInstance ISA 'Win32_Process'"
$Start_Action = {
$ProcName = $event.SourceEventArgs.NewEvent.TargetInstance.Name
$ProcCreated = $event.SourceEventArgs.NewEvent.TargetInstance.CreationDate
$ProcCmdLine = $event.SourceEventArgs.NewEvent.TargetInstance.CommandLine
$LogString ='Start Process: "{1}" starttime: @{0:dd.MM.yyyy HH:mm:ss,ffffff} commandline: {2}' -f $ProcCreated,$ProcName,$ProcCmdLine
write-host $LogString -fo green
$LogString | Out-File procStart.txt -Append
}
$Close_Action = {
$ProcName = $event.SourceEventArgs.NewEvent.TargetInstance.Caption
$ProcCreated = $event.SourceEventArgs.NewEvent.TargetInstance.CreationDate
$EventTime=[DateTime]::FromFileTime($event.SourceEventArgs.NewEvent.TIME_CREATED)
$LogString ='Close Process: "{1}" starttime: @{0:dd.MM.yyyy HH:mm:ss,ffffff} approx.closetime: @{2:dd.MM.yyyy HH:mm:ss,ff}' -f $ProcCreated,$ProcName,$EventTime
write-host $LogString -fo yel
$LogString | Out-File procClose.txt -Append
}
$null = Register-CimIndicationEvent -Query $queryProcessStart -Action $Start_Action
$null = Register-CimIndicationEvent -Query $queryProcessClose -Action $Close_Action
Write-Host 'waiting for process-events ...'
while ($True) {Wait-Event}
für Prozesse, wehe mit System/Admin-Privilegien gestartet werden, wird der Komandozeilenstring nicht ausgegeben!
Warum Batch /Powershell?
Diese Ressource ist auf jedem nativen Windowsrechner vorhanden und es ist nicht nötig irgendwelchen Kram zu installieren. Andere "Fachleute" können begutachten, das nichts schädliches passiert.
Selbst wenn (warum auch immer?) etwas schief gehen sollte, kannst Du via "Ctrl.+Alt+Del" nachwievor den Taskmanager nanuell ausführen und über das Datei->NeueTask... den Explorer/Desktop von Hand starten.
mit dem Kommando:
reg delete "HKCU\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v "Shell" /f
...lässt sich Notfalls die Shellumleitung manuell löschen.