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


24

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

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

답변:


17

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

나는 당신과 같은 질문을했고, Scripting Guy 블로그의 기술을 사용하여 herehere 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.