Bắt đầu tác vụ theo lịch trình bằng cách phát hiện kết nối của thiết bị USB


24

Tôi biết người ta đã thảo luận rằng không thể khởi động ứng dụng từ ổ USB khi kết nối do giới hạn tự động chạy (hoặc tự động phát ??) trong Win 7. Nhưng có thể tạo một tác vụ theo lịch trình có trình kích hoạt loại sự kiện . Chắc chắn phải có một sự kiện xảy ra khi ổ đĩa - hoặc bất kỳ thiết bị USB nào, đối với vấn đề đó - được kết nối.

Có ai có ý tưởng nhỏ nhất mà tôi nên sử dụng ID sự kiện không? Hoặc ít nhất là loại sự kiện? Tôi có thể tìm sự kiện ở đâu trong trình xem sự kiện?

Câu trả lời:


17

Trình lập lịch tác vụ luồng : Làm thế nào để tự động đồng bộ hóa ổ flash USB của tôi? có câu trả lời này bởi một người dùng được gọi là monotone, sử dụng PowerShell cùng với Trình lập lịch tác vụ:

Tôi đã có cùng một câu hỏi với bạn, và đã tìm ra một cái gì đó với powershell (cửa sổ tích hợp sẵn kịch bản) bằng cách sử dụng các kỹ thuật từ Blog Scripting Guy tại đâyđây . Kịch bản chạy liên tục như một quá trình nền, mà bạn có thể bắt đầu đăng nhập hệ thống với trình lập lịch tác vụ. Tập lệnh sẽ được thông báo mỗi khi ổ đĩa mới được cắm và sau đó thực hiện một thao tác nào đó (ở đây bạn định cấu hình tập lệnh thay vì tác vụ). Vì về cơ bản nó bị tạm dừng trong khi chờ ổ cắm tiếp theo, bạn không nên thấy nó chiếm nhiều tài nguyên. Tôi đi đây

1) Bắt đầu Powershell ISE, có thể được tìm thấy trong menu bắt đầu của bạn trong Phụ kiện / Windows Powershell. 2) Sao chép dán phần sau vào 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) Bạn cần sửa đổi tập lệnh ở trên để cho biết tập lệnh cần tìm và ổ đĩa nào cần thực thi. Hai dòng để thay đổi là:

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

Ổ cứng usb của tôi có tên 'Mirror' được đặt là ổ Z :. Bạn chỉ có thể sử dụng if ($driveLabel -eq 'MyDiskLabel')nếu bạn không quan tâm đến bức thư.

start-process "Z:\sync.bat"

Con đường của bất cứ nhiệm vụ nào bạn muốn làm. Trong ví dụ của tôi, tôi đã tạo một tệp bó trên ổ USB của mình để khởi động 3-4 dòng lệnh sao lưu.

4) Khi bạn hoàn tất, hãy lưu tập lệnh của bạn ở đâu đó (tiện ích mở rộng .ps1), sau đó đi tạo một tác vụ trong Trình lập lịch tác vụ để tập lệnh của bạn chạy ở chế độ nền. Của tôi trông như thế này:

  • Kích hoạt: Khi đăng nhập
  • Hành động: Bắt đầu một chương trình
  • Chương trình / kịch bản: powershell
  • Thêm đối số: -ExecutionPolicy Unrestricted -File "D:\Stuff\Backup script.ps1"

5) Võngà!

6) Công cụ bổ sung:

Nếu bạn muốn cửa sổ tập lệnh của bạn bị ẩn, hãy sử dụng các đối số sau:

  • Thêm đối số:
    -WindowStyle Hidden -ExecutionPolicy Unrestricted -File "D:\Stuff\Backup script.ps1"

Nếu bạn muốn xuất các thông điệp tập lệnh thành một tệp nhật ký (được ghi đè mỗi khi tập lệnh bắt đầu, tức là lúc đăng nhập), hãy sử dụng hành động tác vụ sau:

  • Chương trình / tập lệnh: cmd
  • Thêm đối số:
    /c powershell -WindowStyle Hidden -ExecutionPolicy Unrestricted -File "D:\Stuff\Backup script.ps1" > "D:\Stuff\script log.txt "

Bất cứ khi nào bạn muốn kết thúc tập lệnh ẩn đang chạy, bạn có thể kết thúc quá trình "Powershell" trong Trình quản lý tác vụ.

Nhược điểm duy nhất là không có gì sẽ chạy khi bạn khởi động máy tính với ổ đĩa đã được cắm. (Kịch bản có thể được thay đổi để thực hiện kiểm tra đầu tiên mặc dù ban đầu, nhưng tôi đã có đủ cho ngày hôm nay!)


Tôi nghĩ rằng điều này sẽ làm việc tuyệt vời. Hãy để tôi sửa lại và tôi sẽ liên lạc lại với bạn
GiantDuck

1
Nó hoạt động cho các ổ đĩa. Làm cách nào tôi có thể sửa đổi điều này để phát hiện bất kỳ thiết bị USB nào được chèn và không chỉ các ổ đĩa?
GiantDuck

EventType 2 sẽ phát hiện bất kỳ thiết bị nào đến. Để có được các chi tiết sẽ yêu cầu một số đào sâu hơn vào sự kiện. Đơn giản nhất có thể là in các thành viên của $newEvent.SourceEventArgs.NewEventcác sự kiện mà bạn quan tâm.
harrymc

Rất vui khi thấy một câu trả lời đầy hứa hẹn sau gần 4 năm :) Cảm ơn bạn rất nhiều, GiantDuck & harrymc.
gemisigo

@harrymc Bạn có thể cung cấp một số bối cảnh cho điều đó? Tôi chưa bao giờ sử dụng powershell trước đây. Cảm ơn!
GiantDuck

6

Như tôi đã giải thích về cuộc thảo luận này (nhưng đó là về việc chạy chương trình khi tháo ổ USB ), USB Safely Remove , mặc dù không miễn phí, có thể chạy chương trình khi một số sự kiện về thiết bị USB được kích hoạt:

Một tính năng USB an toàn loại bỏ khác biệt với phần mềm tương tự đang bắt đầu bất kỳ ứng dụng nào không chỉ sau khi kết nối thiết bị mà còn trước khi gỡ bỏ nó. Tính năng tự động chạy cho phép bạn thiết lập sao lưu dữ liệu trước khi ngắt kết nối ổ cứng di động, để chạy Total Commander với nội dung của ổ đĩa bút, tự động ngắt kết nối ổ đĩa TrueCrypt được mã hóa trước khi ngắt kết nối phương tiện USB, v.v.

nhập mô tả hình ảnh ở đây

Tất nhiên, điều này không trả lời đầy đủ cho câu hỏi, vì nó không phải là về việc sử dụng các tác vụ theo lịch trình, nhưng mục tiêu là như nhau, tôi nghĩ, đó là chạy một chương trình cụ thể khi cắm USB.


Cảm ơn bạn rất nhiều, một cách giải quyết tốt, nó là. Tôi đã thử nó, mặc dù nó hoạt động tốt, tôi vẫn cố gắng đạt được mục tiêu ban đầu của mình (nghĩa là sử dụng một giải pháp tự nhiên có sẵn và miễn phí). Cho đến nay tôi đã nhận ra rằng sử dụng các sự kiện ID sự kiện 2006 từ DriverFrameworks-UserMode tôi có thể kích hoạt hành động. Nó vẫn chưa hoàn hảo. Thông tin cần thiết có sẵn trong chi tiết sự kiện nhưng tôi không thể lọc nó cho một ổ USB cụ thể, do đó, việc cắm vào bất kỳ ổ USB nào sẽ khiến kích hoạt kích hoạt.
gemisigo

5

Nó sẽ khá dễ dàng khi sử dụng EventVwr.

  1. Tìm sự kiện bạn muốn - Khi tôi cắm thiết bị lưu trữ dung lượng lớn USB, nó đã kích hoạt các sự kiện sau (thuộc danh mục ứng dụng): 20001, 20003, 7036 và một vài thứ khác ít liên quan hơn. Đảm bảo bạn kiểm tra các sự kiện đó với các sự kiện của thiết bị USB khác để tránh các kết quả dương tính giả.

  2. nhấp chuột phải vào sự kiện và nhấp vào "Đính kèm tác vụ cho sự kiện này" (chỉ liên quan trong Windows Vista trở lên - đối với XP có CLI EventTrigger), chọn "Bắt đầu một chương trình" và trỏ nó vào tập lệnh bạn muốn chạy.

  3. Để chuyển đến tập lệnh, các tham số sự kiện bạn cần xem trong bài viết này . Trong các sự kiện 20001 và 20003, bạn có thể tìm thấy đường dẫn UNC đến bộ lưu trữ mới. Sử dụng tiện ích Sysiternals Junction, bạn có thể tạo liên kết đến các đường dẫn UNC.


Tôi thích ý tưởng này, nhưng nó không đủ chi tiết; Tôi không thể có được nó để làm việc.
GiantDuck

@GiantDuck Đối với tôi nó trông khá đơn giản, bạn muốn tôi giải thích điều gì?
EliadTech

Tôi không thể tìm thấy các sự kiện đã nói trong Trình xem sự kiện. (Trên Win8 tại thời điểm này) Đường dẫn chính xác là gì? Cảm ơn bạn!
GiantDuck

Tôi đã viết, đó là nhật ký 'ứng dụng' với các số sự kiện được đề cập ở trên. Nhưng tôi đã thử nghiệm điều này trên Win7, vì vậy có thể trên Win8, các số sự kiện khác nhau. Như tôi đã nói, dù sao bạn cũng sẽ cần thực hiện một số thử nghiệm để đảm bảo nó sẽ hoạt động với mọi thiết bị bạn đang cắm.
EliadTech

1
Trong Win10 không có gì xuất hiện trong danh mục Ứng dụng. Tôi đã phải truy cập Hệ thống và đính kèm ID sự kiện 98. Đối với tôi, tôi sẽ chỉ có một thiết bị đó, nhưng các thiết bị khác có thể không hoạt động
dbinott

2

Tôi đã có thể làm cho điều này hoạt động: Tôi đã tìm thấy sự kiện 1003 trong nhật ký ứng dụng và dịch vụ, Microsoft-Windows-DriverFrameworks-UserMode cho một điện thoại cắm vào usb

Xml đầy đủ của sự kiện:

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

Và bộ lọc sự kiện tùy chỉnh cho nhiệm vụ của tôi:

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

Tương tự đối với ổ USB, đó là sự kiện 2100, 2101, 2105, 2106
Đối với một ổ USB cụ thể:

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

Có vẻ như sự kiện 2101 xảy ra 3 lần với các "<request>"thẻ hơi khác nhau khi tôi cắm vào ổ USB của mình:

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

Tôi không biết điều này có nghĩa là gì nhưng đây là bộ lọc chỉ dành cho một trong số chúng để tránh nhiều kích hoạt: (điều này sẽ chỉ kích hoạt cho ổ USB cụ thể này)

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

Lưu ý rằng ký hiệu phải được thoát như &amp;


1

Như những người khác đã đề cập, có vẻ như Nhật ký hệ thống Sự kiện 7036 từ Trình quản lý điều khiển dịch vụ là sự kiện duy nhất tương quan đáng tin cậy với ổ USB được lắp vào. Tôi đã kiểm tra điều này bằng cách chèn một ổ USB và chạy lệnh powershell sau để liệt kê tất cả các mục nhật ký sự kiện từ tất cả các nguồn trong giờ qua:

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

Thật không may, Sự kiện 7036 được tạo mỗi khi Trình quản lý điều khiển dịch vụ khởi động hoặc dừng thành công bất kỳ dịch vụ nào, do đó cần phải lọc bổ sung.

Bộ lọc có sẵn trong GUI của Trình xem sự kiện / Trình lập lịch tác vụ khá cơ bản và không cho phép lọc bất kỳ dữ liệu sự kiện nào - nó chỉ cho phép bạn lọc trên siêu dữ liệu mà trong trường hợp này không cho bạn biết bất cứ điều gì về dịch vụ nào có thay đổi trạng thái và trạng thái nó đã thay đổi thành. Điều đó được tổ chức trong "param1" và "param2" của EventData. Do đó, bộ lọc XPath sau đây có thể được sử dụng để chỉ bắt giữ dịch vụ có liên quan:

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

Từ đó, bạn có thể chạy tập lệnh của mình, lý tưởng nhất là có một số logic bổ sung để kiểm tra xem ổ USB đã được cắm có phải là ổ đĩa bạn quan tâm không.


0

Tôi đã tìm thấy một sự kiện (IMO) tốt hơn từ nhật ký sự kiện nằm trong Nhật ký ứng dụng và dịch vụ - Microsoft-Windows-Ntfs_Operational. Sự kiện 4. Có vẻ như thế này:

ID sự kiện 4 Ổ đĩa NTFS đã được gắn thành công.

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

Từ đó bạn có thể tạo một trình kích hoạt tác vụ theo lịch trình và bộ lọc theo tên âm lượng và nhãn. Sự kiện này đã được tìm thấy trên hộp Windows Server 2019, tuy nhiên vì một số lý do tôi không thấy nó trên máy tính để bàn Windows 10 (1809) của mình. Có thể là một sự kiện chỉ máy chủ ....

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.