Windows Tasks는 COM 객체를 호출하기 위해 Custom Triggers를 사용하며, Task Scheduler를 통해 실행되기 때문에 언제 트리거될지 예측하기가 더 쉽습니다.
# Show COM CLSIDs$Tasks =Get-ScheduledTaskforeach ($Task in $Tasks){if ($Task.Actions.ClassId -ne$null){if ($Task.Triggers.Enabled -eq$true){$usersSid ="S-1-5-32-545"$usersGroup =Get-LocalGroup|Where-Object { $_.SID-eq $usersSid }if ($Task.Principal.GroupId -eq $usersGroup){Write-Host"Task Name: " $Task.TaskNameWrite-Host"Task Path: " $Task.TaskPathWrite-Host"CLSID: " $Task.Actions.ClassIdWrite-Host}}}}# Sample Output:# Task Name: Example# Task Path: \Microsoft\Windows\Example\# CLSID: {1936ED8A-BD93-3213-E325-F38D112938E1}# [more like the previous one...]
출력을 확인하면 사용자가 로그인할 때마다 실행될 작업을 선택할 수 있습니다.
이제 HKEY_CLASSES_ROOT\CLSID와 HKLM 및 HKCU에서 CLSID **{1936ED8A-BD93-3213-E325-F38D112938EF}**를 검색하면, 일반적으로 HKCU에 값이 존재하지 않는 것을 발견할 수 있습니다.
# Exists in HKCR\CLSID\Get-ChildItem-Path"Registry::HKCR\CLSID\{1936ED8A-BD93-3213-E325-F38D112938EF}"NameProperty------------InprocServer32 (default) : C:\Windows\system32\some.dllThreadingModel:Both# Exists in HKLMGet-Item-Path"HKLM:Software\Classes\CLSID\{01575CFE-9A55-4003-A5E1-F38D1EBDCBE1}"|ft-AutoSizeNameProperty------------{01575CFE-9A55-4003-A5E1-F38D1EBDCBE1} (default) : MsCtfMonitor task handler# Doesn't exist in HKCUPSC:\> Get-Item-Path"HKCU:Software\Classes\CLSID\{01575CFE-9A55-4003-A5E1-F38D1EBDCBE1}"Get-Item : Cannot find path 'HKCU:\Software\Classes\CLSID\{01575CFE-9A55-4003-A5E1-F38D1EBDCBE1}' because it does not exist.