Memulai tugas yang dijadwalkan dengan mendeteksi koneksi perangkat USB

24

Saya tahu telah dibahas bahwa tidak mungkin untuk memulai aplikasi dari drive usb pada koneksi karena keterbatasan autorun (atau autoplay ??) di Win 7. Tetapi dimungkinkan untuk membuat tugas yang dijadwalkan memiliki pemicu jenis acara . Tentunya harus ada peristiwa yang terjadi ketika drive - atau perangkat USB, dalam hal ini - terhubung.

Adakah yang tahu sedikit pun ID Peristiwa mana yang harus saya gunakan? Atau setidaknya jenis acara apa? Di mana saya dapat menemukan acara di penampil acara?

gemisigo
sumber

Jawaban:

17

Penjadwal Tugas utas : Bagaimana cara menyinkronkan USB flash drive saya secara otomatis? memiliki jawaban ini oleh pengguna bernama monoton, yang menggunakan PowerShell bersama dengan Penjadwal Tugas:

Saya memiliki pertanyaan yang sama dengan Anda, dan mengerjakan sesuatu dengan PowerShell (windows built-in scripting) menggunakan teknik dari Scripting Guy Blog di sini dan di sini . Script berjalan terus menerus sebagai proses latar belakang, yang dapat Anda mulai pada logon sistem dengan penjadwal tugas. Script akan diberitahukan setiap kali drive baru dicolokkan dan kemudian melakukan sesuatu (di sini Anda mengkonfigurasi skrip daripada tugas). Karena pada dasarnya dijeda saat menunggu drive terpasang yang berikutnya, Anda tidak perlu menghabiskan banyak sumber daya. Ini dia:

1) Mulai Powershell ISE, yang dapat ditemukan di menu mulai Anda di bawah Accessories / Windows Powershell. 2) Salin rekatkan yang berikut ke 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) Anda perlu memodifikasi skrip di atas untuk memberi tahu skrip drive apa yang harus dicari, dan apa yang harus dijalankan. Dua baris yang akan diubah adalah:

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

Hard drive usb saya bernama 'Mirror' diset sebagai drive Z :. Anda bisa menggunakannya if ($driveLabel -eq 'MyDiskLabel')jika Anda tidak peduli dengan surat itu.

start-process "Z:\sync.bat"

Jalur tugas apa pun yang ingin Anda lakukan. Dalam contoh saya, saya telah membuat file batch pada drive USB saya yang mulai 3-4 baris perintah tugas cadangan.

4) Setelah selesai, simpan skrip Anda di suatu tempat (ekstensi .ps1), lalu buat tugas di Penjadwal Tugas agar skrip Anda berjalan di latar belakang. Milik saya terlihat seperti ini:

  • Pemicu: Saat masuk
  • Tindakan: Mulai program
  • Program / skrip: PowerShell
  • Tambahkan argumen: -ExecutionPolicy Unrestricted -File "D:\Stuff\Backup script.ps1"

5) Voa!

6) Barang ekstra:

Jika Anda ingin jendela skrip Anda disembunyikan, gunakan argumen ini:

  • Tambahkan argumen:
    -WindowStyle Hidden -ExecutionPolicy Unrestricted -File "D:\Stuff\Backup script.ps1"

Jika Anda ingin menampilkan pesan skrip ke file log (yang ditimpa setiap kali skrip dimulai, yaitu saat masuk), gunakan tindakan tugas berikut:

  • Program / skrip: cmd
  • Tambahkan argumen:
    /c powershell -WindowStyle Hidden -ExecutionPolicy Unrestricted -File "D:\Stuff\Backup script.ps1" > "D:\Stuff\script log.txt "

Kapan pun Anda ingin mengakhiri skrip tersembunyi yang sedang berjalan, Anda bisa mengakhiri proses "Powershell" di Task Manager.

Satu-satunya downside adalah bahwa tidak ada yang akan berjalan ketika Anda mem-boot komputer Anda dengan drive sudah terpasang. (Script dapat diubah untuk melakukan pemeriksaan pertama pada awalnya, tetapi saya sudah cukup untuk hari ini!)

harrymc
sumber
Saya pikir ini akan bekerja dengan baik. Biarkan saya bermain-main dengan itu dan saya akan kembali kepada Anda
GiantDuck
1
Ini bekerja untuk drive. Bagaimana saya bisa mengubah ini untuk mendeteksi setiap perangkat USB dimasukkan, dan tidak hanya drive?
GiantDuck
EventType 2 akan mendeteksi kedatangan perangkat apa pun. Untuk mendapatkan detail akan membutuhkan lebih banyak penggalian ke acara tersebut. Paling sederhana adalah mencetak anggota $newEvent.SourceEventArgs.NewEventuntuk acara yang Anda minati.
harrymc
Senang melihat jawaban yang menjanjikan setelah hampir 4 tahun :) Terima kasih banyak, GiantDuck & harrymc.
gemisigo
@harrymc Bisakah Anda memberikan konteks untuk itu? Saya belum pernah menggunakan PowerShell sebelumnya. Terima kasih!
GiantDuck
6

Seperti yang sudah saya jelaskan pada diskusi ini (tapi itu tentang menjalankan program ketika drive USB dilepas), USB Safely Remove , meskipun tidak gratis, dapat menjalankan program ketika beberapa peristiwa tentang perangkat USB dipicu:

Fitur USB Safely Remove lain yang membedakannya dari perangkat lunak serupa adalah memulai aplikasi apa pun tidak hanya setelah menghubungkan perangkat , tetapi juga sebelum melepasnya. Fitur autorun memungkinkan Anda mengatur cadangan data sebelum melepaskan hard drive yang dapat dilepas, untuk menjalankan Total Commander dengan isi drive-pena, secara otomatis meng-unmount drive TrueCrypt yang dienkripsi sebelum melepaskan media USB, dll.

masukkan deskripsi gambar di sini

Tentu saja, ini tidak sepenuhnya menjawab pertanyaan, karena ini bukan tentang menggunakan tugas yang dijadwalkan, tetapi tujuannya sama, saya pikir, yaitu menjalankan program tertentu ketika stik USB dicolokkan.

Snark
sumber
Terima kasih banyak, solusinya bagus. Saya sudah mencobanya tetapi meskipun berfungsi dengan baik, saya masih berusaha untuk mencapai tujuan awal saya (yaitu, menggunakan solusi yang tersedia secara gratis dan gratis). Sejauh ini saya sudah tahu bahwa menggunakan event ID 2006 peristiwa dari DriverFrameworks-UserMode saya bisa memicu tindakan. Ini masih belum sempurna. Info yang diperlukan tersedia di detail acara tetapi saya tidak bisa memfilternya untuk drive USB tertentu, jadi mencolokkan drive USB apa pun akan menyebabkan pelatuknya menyala.
gemisigo
5

Seharusnya cukup mudah menggunakan EventVwr.

  1. Temukan acara yang Anda inginkan - Ketika saya menyambungkan perangkat penyimpan massal USB, ia memicu peristiwa berikut (di bawah kategori aplikasi): 20001, 20003, 7036 dan beberapa lainnya yang kurang relevan. Pastikan Anda menguji peristiwa itu terhadap peristiwa perangkat USB lain untuk menghindari kesalahan positif.

  2. klik kanan pada acara tersebut dan klik "Lampirkan tugas ke acara ini" (hanya relevan di Windows Vista atau lebih tinggi - untuk XP ada CLI EventTrigger), pilih "Mulai Program" dan arahkan ke skrip yang ingin Anda jalankan.

  3. Untuk meneruskan ke skrip, parameter acara Anda perlu melihatnya di artikel ini . Di bawah peristiwa 20001 dan 20003 Anda dapat menemukan jalur UNC ke penyimpanan baru. Menggunakan utilitas Sysinternals Junction Anda dapat membuat tautan ke jalur UNC.

EliadTech
sumber
Saya suka ide ini, tetapi tidak cukup detail; Saya tidak bisa membuatnya bekerja.
GiantDuck
@GiantDuck Bagi saya itu terlihat sangat mudah, pada apa yang Anda ingin saya jelaskan?
EliadTech
Saya tidak dapat menemukan acara tersebut di Event Viewer. (Pada Win8 saat ini) Apa jalan yang tepat? Terima kasih!
GiantDuck
Saya menulis, itu di bawah 'aplikasi' log dengan nomor acara yang disebutkan di atas. Tapi saya sudah menguji ini pada Win7, jadi mungkin pada Win8 nomor acara berbeda. Seperti yang saya katakan Anda akan perlu melakukan beberapa pengujian untuk memastikan itu akan bekerja dengan perangkat yang Anda pasang.
EliadTech
1
Di Win10 tidak ada yang muncul dalam kategori Aplikasi. Saya harus membuka System dan melampirkan ke Event ID 98. Tidak masalah bagi saya karena saya hanya akan memiliki satu perangkat, tetapi yang lain mungkin tidak berfungsi
dbinott
2

Saya dapat menjalankan ini: Saya menemukan event 1003 di aplikasi dan layanan log, Microsoft-Windows-DriverFrameworks-UserMode untuk telepon yang terhubung ke usb

Xml penuh acara:

- <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>

Dan filter acara khusus untuk tugas saya:

<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>

Demikian pula untuk drive USB itu acara 2100, 2101, 2105, 2106
Untuk Drive USB tertentu:

- <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>

Sepertinya peristiwa 2101 terjadi 3 kali dengan "<request>"tag yang sedikit berbeda ketika saya mencolokkan drive usb saya:

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

Saya tidak tahu apa artinya ini tetapi di sini adalah filter untuk hanya satu dari mereka untuk menghindari beberapa pemicu: (ini hanya akan memicu untuk drive USB khusus ini)

<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>

Perhatikan bahwa ampersand harus diloloskan sebagai &amp;

garbb
sumber
1

Seperti yang telah disebutkan orang lain, tampaknya System log Event 7036 dari Service Control Manager adalah satu-satunya peristiwa yang berkorelasi secara andal dengan drive USB yang dimasukkan. Saya memeriksa ini dengan memasukkan drive USB dan menjalankan perintah PowerShell berikut untuk mendaftar semua entri log peristiwa dari semua sumber dalam satu jam terakhir:

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

Sayangnya, Peristiwa 7036 dihasilkan setiap kali Manajer Kontrol Layanan berhasil memulai atau menghentikan layanan apa pun, sehingga diperlukan penyaringan tambahan.

Pemfilteran yang tersedia di GUI dari Peraga Peristiwa / Penjadwal Tugas cukup mendasar dan tidak memungkinkan pemfilteran pada data acara - ini hanya memungkinkan Anda memfilter pada metadata yang dalam hal ini tidak memberi tahu Anda apa pun tentang layanan yang memiliki mengubah status dan status apa yang telah diubah. Itu diadakan di "param1" dan "param2" dari EventData. Karena itu filter XPath berikut dapat digunakan untuk menangkap hanya layanan yang relevan yang memulai:

<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>

Dari sana Anda dapat menjalankan skrip, idealnya dengan beberapa logika tambahan untuk memeriksa apakah drive USB yang telah dimasukkan adalah yang Anda minati.

sahmeepee
sumber
0

Saya menemukan acara (IMO) yang lebih baik dari log peristiwa yang terletak di bawah Aplikasi dan Log Layanan-Microsoft-Windows-Ntfs_Operational. Eventid 4. Sepertinya ini:

ID Peristiwa 4 Volume NTFS telah berhasil dipasang.

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

Dari itu Anda dapat membuat pemicu tugas yang dijadwalkan dan memfilter menurut nama volume dan atau label. Acara ini ditemukan pada kotak Windows Server 2019, namun karena beberapa alasan saya tidak melihatnya di desktop Windows 10 (1809) saya. Mungkin hanya acara server ....

RyanG
sumber