USB 장치의 연결을 감지하여 예약 된 작업 시작 . 드라이브

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

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



답변

스레드 작업 스케줄러 : 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”프로세스를 종료 할 수 있습니다.

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


답변

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

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

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

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


답변

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

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

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

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


답변

이 작업을 수행 할 수있었습니다. 응용 프로그램 및 서비스 로그에서 이벤트 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;


답변

다른 사람들이 언급했듯이 서비스 제어 관리자의 시스템 로그 이벤트 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 드라이브가 관심있는 드라이브인지 확인하기위한 추가 논리를 사용하여 스크립트를 실행할 수 있습니다.


답변

응용 프로그램 및 서비스 로그-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) 바탕 화면에 표시되지 않습니다. 서버 전용 이벤트 일 수 있습니다 ….


답변