USB 장치의 연결을 감지하여 예약 된 작업 시작


24

Win 7의 자동 실행 (또는 자동 재생 ??) 제한으로 인해 연결시 USB 드라이브에서 응용 프로그램을 시작할 수 없다는 것이 논의되었습니다. 그러나 이벤트 유형 트리거가있는 예약 된 작업을 만들 수 있습니다 . 드라이브 또는 해당 USB 장치가 연결되어있을 때 반드시 이벤트가 발생해야합니다.

누구든지 어떤 이벤트 ID를 사용해야하는지 조금이라도 알고 있습니까? 아니면 적어도 어떤 유형의 이벤트입니까? 이벤트 뷰어에서 이벤트를 어디서 찾을 수 있습니까?

답변:


17

스레드 작업 스케줄러 : USB 플래시 드라이브를 자동으로 동기화하는 방법 작업 스케줄러와 함께 PowerShell을 사용하는 monotone이라는 사용자 가이 답변을 얻었습니다.

나는 당신과 같은 질문을했고, Scripting Guy 블로그의 기술을 사용하여 here 및 here powershell (Windows 내장 스크립팅)으로 무언가를 해결했습니다 . 스크립트는 백그라운드 프로세스로 계속 실행되며 작업 스케줄러를 사용하여 시스템 로그온시 시작할 수 있습니다. 새 드라이브가 연결될 때마다 스크립트에 알림이 표시되고 무언가를 수행합니다 (여기서 작업 대신 스크립트를 구성). 다음에 연결된 드라이브를 기다리는 동안 기본적으로 일시 정지되므로 많은 자원을 차지하지 않아야합니다. 내가 간다:

1) 시작 메뉴의 보조 프로그램 / Windows Powershell에있는 Powershell ISE를 시작하십시오. 2) 다음을 Powershell에 붙여 넣습니다.

#Requires -version 2.0
Register-WmiEvent -Class win32_VolumeChangeEvent -SourceIdentifier volumeChange
write-host (get-date -format s) " Beginning script..."
do{
$newEvent = Wait-Event -SourceIdentifier volumeChange
$eventType = $newEvent.SourceEventArgs.NewEvent.EventType
$eventTypeName = switch($eventType)
{
1 {"Configuration changed"}
2 {"Device arrival"}
3 {"Device removal"}
4 {"docking"}
}
write-host (get-date -format s) " Event detected = " $eventTypeName
if ($eventType -eq 2)
{
$driveLetter = $newEvent.SourceEventArgs.NewEvent.DriveName
$driveLabel = ([wmi]"Win32_LogicalDisk='$driveLetter'").VolumeName
write-host (get-date -format s) " Drive name = " $driveLetter
write-host (get-date -format s) " Drive label = " $driveLabel
# Execute process if drive matches specified condition(s)
if ($driveLetter -eq 'Z:' -and $driveLabel -eq 'Mirror')
{
write-host (get-date -format s) " Starting task in 3 seconds..."
start-sleep -seconds 3
start-process "Z:\sync.bat"
}
}
Remove-Event -SourceIdentifier volumeChange
} while (1-eq1) #Loop until next event
Unregister-Event -SourceIdentifier volumeChange

3) 스크립트에서 찾아야 할 드라이브와 실행 대상을 알려주려면 위 스크립트를 수정해야합니다. 변경할 두 줄은 다음과 같습니다.

if ($driveLetter -eq 'Z:' -and $driveLabel -eq 'Mirror')

'Mirror'라는 USB 하드 드라이브가 Z : 드라이브로 설정되어 있습니다. if ($driveLabel -eq 'MyDiskLabel')편지를 신경 쓰지 않으면 그냥 사용할 수 있습니다.

start-process "Z:\sync.bat"

원하는 작업 경로. 이 예에서는 USB 드라이브에 3-4 백업 작업 명령 줄을 시작하는 배치 파일을 만들었습니다.

4) 완료되면 스크립트를 어딘가에 저장하고 (확장자 .ps1) 작업 스케줄러에서 작업을 작성하여 백그라운드에서 스크립트를 실행하십시오. 광산은 다음과 같습니다.

  • 트리거 : 로그온시
  • 작업 : 프로그램 시작
  • 프로그램 / 스크립트 : powershell
  • 인수 추가 : -ExecutionPolicy Unrestricted -File "D:\Stuff\Backup script.ps1"

5) Voilà!

6) 추가 사항 :

스크립트 창을 숨기려면 다음 인수를 사용하십시오.

  • 인수 추가 :
    -WindowStyle Hidden -ExecutionPolicy Unrestricted -File "D:\Stuff\Backup script.ps1"

스크립트 메시지를 로그 파일로 출력하려면 (스크립트가 시작될 때마다 (즉 로그온 할 때마다 덮어 쓰기)) 다음 태스크 조치를 사용하십시오.

  • 프로그램 / 스크립트 : cmd
  • 인수 추가 :
    /c powershell -WindowStyle Hidden -ExecutionPolicy Unrestricted -File "D:\Stuff\Backup script.ps1" > "D:\Stuff\script log.txt "

숨겨진 스크립트 실행을 종료 할 때마다 작업 관리자에서 "Powershell"프로세스를 종료 할 수 있습니다.

유일한 단점은 이미 드라이브가 연결되어있는 상태에서 컴퓨터를 부팅 할 때 아무것도 실행되지 않는다는 것입니다.


나는 이것이 잘 작동 할 것이라고 생각한다. 내가 그것에 대해 땜질하자 다시 연락 드리겠습니다
— GiantDuck

1
드라이브에서 작동합니다. 어떻게 감지하려면이 옵션을 수정할 수 있는 USB 장치는 드라이브를 삽입하지?
— GiantDuck

EventType 2는 모든 장치 도착을 감지합니다. 세부 정보를 얻으려면 이벤트에 더 많은 파고가 필요합니다. $newEvent.SourceEventArgs.NewEvent관심있는 이벤트를 위해 회원을 인쇄하는 것이 가장
— 간단합니다

거의 4 년이 지나면 유망한 답변을 보게되어 반갑습니다. : GiantDuck & harrymc.
— gemisigo

@harrymc 이에 대한 컨텍스트를 제공 할 수 있습니까? 나는 전에 파워 쉘을 사용한 적이 없다. 감사!
— GiantDuck

6

이 토론 에서 이미 설명했듯이 (USB 드라이브가 제거 될 때 프로그램을 실행하는 것에 관한 것이 었습니다), USB Safely Remove 는 무료는 아니지만 USB 장치에 대한 일부 이벤트가 트리거 될 때 프로그램을 실행할 수 있습니다.

유사한 소프트웨어와 구별되는 또 다른 USB 안전 제거 기능 은 장치를 연결 한 후 뿐만 아니라 제거하기 전에 응용 프로그램을 시작 하는 것입니다. 자동 실행 기능을 사용하면 이동식 하드 드라이브를 분리하기 전에 데이터 백업을 설정하고, 펜 드라이브의 내용으로 Total Commander를 실행하고, USB 미디어를 분리하기 전에 암호화 된 TrueCrypt 드라이브를 자동으로 마운트 해제 할 수 있습니다.

여기에 이미지 설명을 입력하십시오

물론 이것은 예약 된 작업을 사용하는 것이 아니기 때문에 질문에 완전히 대답하지는 않지만 목표는 동일합니다 .USB 스틱이 연결되어있을 때 특정 프로그램을 실행하는 것입니다.


정말 고마워요, 좋은 해결 방법입니다. 나는 그것을 시도했지만 제대로 작동하지만 여전히 원래 목표를 달성하려고 노력하고 있습니다 (즉, 기본적으로 사용 가능한 무료 솔루션 사용). 지금까지 DriverFrameworks-UserMode의 Event ID 2006 이벤트를 사용하여 작업을 트리거 할 수 있다는 것을 알았습니다. 그래도 여전히 완벽하지는 않습니다. 필요한 정보는 이벤트 세부 정보에서 확인할 수 있지만 특정 USB 드라이브에 대해 필터링 할 수 없으므로 USB 드라이브를 연결하면 트리거가 발생합니다.
— gemisigo

5

EventVwr을 사용하면 매우 쉽습니다.

  1. 원하는 이벤트 찾기-USB 대용량 저장 장치를 연결하면 20001, 20003, 7036 및 기타 관련성이 낮은 이벤트가 발생했습니다. 오 탐지를 피하기 위해 다른 USB 장치 이벤트와 비교하여 해당 이벤트를 테스트하십시오.

  2. 이벤트를 마우스 오른쪽 단추로 클릭하고 "이 이벤트에 태스크 첨부"(Windows Vista 이상에만 해당-XP의 경우 CLI EventTrigger가 있음)를 클릭하고 "프로그램 시작"을 선택하고 실행하려는 스크립트를 가리 킵니다.

  3. 스크립트에 이벤트 매개 변수를 전달하려면 이 기사를 참조하십시오 . 이벤트 20001 및 20003에서 새 스토리지에 대한 UNC 경로를 찾을 수 있습니다. Sysinternals Junction 유틸리티를 사용하여 UNC 경로에 대한 링크를 작성할 수 있습니다.


나는 이것에 대한 아이디어를 좋아하지만 충분히 자세하지는 않다. 나는 그것을 작동시킬 수 없다.
— GiantDuck

@GiantDuck 저에게있어 매우 정교하게 보입니다.
— EliadTech

이벤트 뷰어에서 해당 이벤트를 찾을 수 없습니다. (현재 Win8에서) 정확한 경로는 무엇입니까? 고맙습니다!
— GiantDuck

필자는 위에서 언급 한 이벤트 번호가있는 '응용 프로그램'로그에 있습니다. 그러나 Win7에서 이것을 테스트 했으므로 Win8에서는 이벤트 번호가 다릅니다. 내가 말했듯이 어쨌든 연결하는 모든 장치에서 작동하는지 테스트하기 위해 테스트를 수행해야합니다.
— EliadTech

1
Win10에서는 응용 프로그램 범주에 아무것도 나타나지 않았습니다. 나는 오직 것이다 원인 I 시스템에 가서 나를 위해 이벤트 ID 98이의 벌금에 부착했다 그 하나의 장치,하지만 다른 수도없는 일
— dbinott

2

이 작업을 수행 할 수있었습니다. 응용 프로그램 및 서비스 로그에서 이벤트 1003, USB에 연결된 전화의 Microsoft-Windows-DriverFrameworks-UserMode를 발견했습니다.

이벤트의 전체 XML :

- <Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
- <System>
  <Provider Name="Microsoft-Windows-DriverFrameworks-UserMode" Guid="{2E35AAEB-857F-4BEB-A418-2E6C0E54D988}" /> 
  <EventID>1003</EventID> 
  <Version>1</Version> 
  <Level>4</Level> 
  <Task>17</Task> 
  <Opcode>1</Opcode> 
  <Keywords>0x8000000000000000</Keywords> 
  <TimeCreated SystemTime="2016-08-19T01:42:06.292278900Z" /> 
  <EventRecordID>17516</EventRecordID> 
  <Correlation /> 
  <Execution ProcessID="456" ThreadID="2932" /> 
  <Channel>Microsoft-Windows-DriverFrameworks-UserMode/Operational</Channel> 
  <Computer>5CG6070VFK-W7.nikonprecision.com</Computer> 
  <Security UserID="S-1-5-18" /> 
  </System>
- <UserData>
- <UMDFDriverManagerHostCreateStart lifetime="{AFEC92AD-6015-4AB4-86AE-F34CEE06A977}" xmlns:auto-ns2="http://schemas.microsoft.com/win/2004/08/events" xmlns="http://www.microsoft.com/DriverFrameworks/UserMode/Event">
  <HostGuid>{193a1820-d9ac-4997-8c55-be817523f6aa}</HostGuid> 
  <DeviceInstanceId>USB.VID_04E8&PID_6860&MS_COMP_MTP&SAMSUNG_ANDROID.6&3400EB54&1&0000</DeviceInstanceId> 
  </UMDFDriverManagerHostCreateStart>
  </UserData>
  </Event>

그리고 내 작업에 대한 사용자 정의 이벤트 필터 :

<QueryList>
  <Query Id="0" Path="Microsoft-Windows-DriverFrameworks-UserMode/Operational">
    <Select Path="Microsoft-Windows-DriverFrameworks-UserMode/Operational">*[System[Provider[@Name='Microsoft-Windows-DriverFrameworks-UserMode'] and EventID=1003]] and *[UserData[UMDFDriverManagerHostCreateStart[DeviceInstanceId="USB.VID_04E8&amp;PID_6860&amp;MS_COMP_MTP&amp;SAMSUNG_ANDROID.6&amp;3400EB54&amp;1&amp;0000"]]]</Select>
  </Query>
</QueryList>

USB 드라이브의 경우와 마찬가지로 이벤트 2100, 2101, 2105, 2106이었습니다
. 특정 USB 드라이브의 경우 :

- <Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
- <System>
  <Provider Name="Microsoft-Windows-DriverFrameworks-UserMode" Guid="{2E35AAEB-857F-4BEB-A418-2E6C0E54D988}" /> 
  <EventID>2101</EventID> 
  <Version>1</Version> 
  <Level>4</Level> 
  <Task>37</Task> 
  <Opcode>2</Opcode> 
  <Keywords>0x8000000000000000</Keywords> 
  <TimeCreated SystemTime="2016-08-19T01:52:37.922289600Z" /> 
  <EventRecordID>17662</EventRecordID> 
  <Correlation /> 
  <Execution ProcessID="10956" ThreadID="11892" /> 
  <Channel>Microsoft-Windows-DriverFrameworks-UserMode/Operational</Channel> 
  <Computer>5CG6070VFK-W7.nikonprecision.com</Computer> 
  <Security UserID="S-1-5-19" /> 
  </System>
- <UserData>
- <UMDFHostDeviceRequest instance="WPDBUSENUMROOT\UMB\2&37C186B&0&STORAGE#VOLUME#_??_USBSTOR#DISK&VEN_SANDISK&PROD_SANDISK_CRUZER&REV_8.02#0774230A28933B7E&0#" lifetime="{4493DBFB-81E8-4277-933D-955C4DDDD482}" xmlns:auto-ns2="http://schemas.microsoft.com/win/2004/08/events" xmlns="http://www.microsoft.com/DriverFrameworks/UserMode/Event">
- <Request major="27" minor="20">
  <Argument>0x0</Argument> 
  <Argument>0x141b</Argument> 
  <Argument>0x0</Argument> 
  <Argument>0x0</Argument> 
  </Request>
  <Status>0</Status> 
  </UMDFHostDeviceRequest>
  </UserData>
  </Event>

"<request>"USB 드라이브를 연결하면 이벤트 2101이 약간 다른 태그로 3 번 발생하는 것처럼 보입니다 .

<Request major="27" minor="20">
<Request major="27" minor="9">
<Request major="27" minor="0">

이것이 무엇을 의미하는지 모르겠지만 여기에 여러 트리거를 피하기 위해 그중 하나에 대한 필터가 있습니다 (이것은이 특정 USB 드라이브에 대해서만 트리거됩니다)

<QueryList>
  <Query Id="0" Path="Microsoft-Windows-DriverFrameworks-UserMode/Operational">
    <Select Path="Microsoft-Windows-DriverFrameworks-UserMode/Operational">*[System[Provider[@Name='Microsoft-Windows-DriverFrameworks-UserMode'] and  EventID=2101]] and *[UserData[UMDFHostDeviceRequest[@instance="WPDBUSENUMROOT\UMB\2&amp;37C186B&amp;0&amp;STORAGE#VOLUME#_??_USBSTOR#DISK&amp;VEN_SANDISK&amp;PROD_SANDISK_CRUZER&amp;REV_8.02#0774230A28933B7E&amp;0#" and Request[@major="27" and @minor="20"]]]]</Select>
  </Query>
</QueryList>

앰퍼샌드는 다음과 같이 이스케이프되어야합니다. &amp;


1

다른 사람들이 언급했듯이 서비스 제어 관리자의 시스템 로그 이벤트 7036은 USB 드라이브 삽입과 안정적으로 관련된 유일한 이벤트 인 것 같습니다. USB 드라이브를 삽입하고 다음 powershell 명령을 실행하여 지난 1 시간 동안 모든 소스의 모든 이벤트 로그 항목을 나열하여이를 확인했습니다.

get-winevent | where {$_.timecreated -ge (get-date) - (new-timespan -hour 1)}

불행하게도 서비스 제어 관리자가 서비스를 시작하거나 중지 할 때마다 이벤트 7036이 생성되므로 추가 필터링이 필요합니다.

이벤트 뷰어 / 작업 스케줄러의 GUI에서 사용할 수있는 필터링은 매우 기본적이고 이벤트 데이터에 대한 필터링을 허용하지 않습니다.이 경우 메타 데이터 만 필터링 할 수 있습니다. 변경된 상태 및 변경된 상태 이는 EventData의 "param1"및 "param2"에 유지됩니다. 따라서 다음 XPath 필터를 사용하여 관련 서비스 시작 만 캡처 할 수 있습니다.

<QueryList>
  <Query Id="0" Path="System">
    <Select Path="System">*[System[Provider[@Name='Service Control Manager'] and (Level=4 or Level=0) and (band(Keywords,36028797018963968)) and (EventID=7036)]]
and
*[EventData[
  Data[@Name="param1"]="Portable Device Enumerator Service" and
  Data[@Name="param2"]="running"
  ]
]
</Select>
  </Query>
</QueryList>

여기에서 삽입 된 USB 드라이브가 관심있는 드라이브인지 확인하기위한 추가 논리를 사용하여 스크립트를 실행할 수 있습니다.


0

응용 프로그램 및 서비스 로그-Microsoft-Windows-Ntfs_Operational에있는 이벤트 로그에서 더 나은 (IMO) 이벤트를 발견했습니다. Eventid 4. 다음과 같습니다.

이벤트 ID 4 NTFS 볼륨이 성공적으로 마운트되었습니다.

       Volume GUID: {55bf0ee3-d507-4031-a60a-22e5892ebf37}
       Volume Name: E:
       Volume Label: AirGapDrive A
       Device Name: \Device\HarddiskVolume51

이를 통해 예약 된 작업 트리거를 생성하고 볼륨 이름 및 / 또는 레이블별로 필터링 할 수 있습니다. 이 이벤트는 Windows Server 2019 상자에서 발견되었지만 어떤 이유로 Windows 10 (1809) 바탕 화면에 표시되지 않습니다. 서버 전용 이벤트 일 수 있습니다 ....

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.