답변:
스레드 작업 스케줄러 : 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"프로세스를 종료 할 수 있습니다.
유일한 단점은 이미 드라이브가 연결되어있는 상태에서 컴퓨터를 부팅 할 때 아무것도 실행되지 않는다는 것입니다.
$newEvent.SourceEventArgs.NewEvent
관심있는 이벤트를 위해 회원을 인쇄하는 것이 가장
이 토론 에서 이미 설명했듯이 (USB 드라이브가 제거 될 때 프로그램을 실행하는 것에 관한 것이 었습니다), USB Safely Remove 는 무료는 아니지만 USB 장치에 대한 일부 이벤트가 트리거 될 때 프로그램을 실행할 수 있습니다.
유사한 소프트웨어와 구별되는 또 다른 USB 안전 제거 기능 은 장치를 연결 한 후 뿐만 아니라 제거하기 전에 응용 프로그램을 시작 하는 것입니다. 자동 실행 기능을 사용하면 이동식 하드 드라이브를 분리하기 전에 데이터 백업을 설정하고, 펜 드라이브의 내용으로 Total Commander를 실행하고, USB 미디어를 분리하기 전에 암호화 된 TrueCrypt 드라이브를 자동으로 마운트 해제 할 수 있습니다.
물론 이것은 예약 된 작업을 사용하는 것이 아니기 때문에 질문에 완전히 대답하지는 않지만 목표는 동일합니다 .USB 스틱이 연결되어있을 때 특정 프로그램을 실행하는 것입니다.
EventVwr을 사용하면 매우 쉽습니다.
원하는 이벤트 찾기-USB 대용량 저장 장치를 연결하면 20001, 20003, 7036 및 기타 관련성이 낮은 이벤트가 발생했습니다. 오 탐지를 피하기 위해 다른 USB 장치 이벤트와 비교하여 해당 이벤트를 테스트하십시오.
이벤트를 마우스 오른쪽 단추로 클릭하고 "이 이벤트에 태스크 첨부"(Windows Vista 이상에만 해당-XP의 경우 CLI EventTrigger가 있음)를 클릭하고 "프로그램 시작"을 선택하고 실행하려는 스크립트를 가리 킵니다.
스크립트에 이벤트 매개 변수를 전달하려면 이 기사를 참조하십시오 . 이벤트 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&PID_6860&MS_COMP_MTP&SAMSUNG_ANDROID.6&3400EB54&1&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&37C186B&0&STORAGE#VOLUME#_??_USBSTOR#DISK&VEN_SANDISK&PROD_SANDISK_CRUZER&REV_8.02#0774230A28933B7E&0#" and Request[@major="27" and @minor="20"]]]]</Select>
</Query>
</QueryList>
앰퍼샌드는 다음과 같이 이스케이프되어야합니다. &
다른 사람들이 언급했듯이 서비스 제어 관리자의 시스템 로그 이벤트 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) 바탕 화면에 표시되지 않습니다. 서버 전용 이벤트 일 수 있습니다 ....