USB cihazının bağlantısını algılayarak zamanlanmış görevin başlatılması


24

Win 7'deki autorun (ya da autoplay ??) kısıtlamaları nedeniyle bağlantı sırasında bir usb sürücüden bir uygulamanın başlatılmasının mümkün olmadığı tartışıldığını biliyorum. . Elbette, sürücü - ya da herhangi bir USB cihazı için - bağlıyken meydana gelen bir olay olması gerekir.

Hangi Olay Kimliğini kullanmam gerektiği konusunda en ufak bir fikri olan var mı? Ya da en azından ne tür bir etkinlik? Etkinliği etkinlik görüntüleyicide nerede bulabilirim?

Yanıtlar:


17

Task Scheduler thread : USB flash sürücümü otomatik olarak nasıl senkronize edebilirim? Görev Zamanlayıcısı ile birlikte PowerShell'i kullanan monoton adlı bir kullanıcı tarafından bu cevaba sahiptir:

Seninle aynı soruyu sordum ve burada ve burada Scripting Guy Blog'undaki teknikleri kullanarak powershell (pencerelerde yerleşik komut dosyası) ile bir şeyler çözdüm . Betik, görev zamanlayıcı ile sistem oturum açma sırasında başlayabileceğiniz bir arka plan işlemi olarak sürekli çalışır. Her yeni bir sürücü takıldığında komut dosyası size bildirilir ve ardından bir şey yapılır (burada görev yerine komut dosyasını yapılandırırsınız). Bir sonraki takılı sürücüyü beklerken temel olarak duraklatılmış olduğundan, fazla kaynak harcayacağını görmemelisiniz. İşte gidiyorum:

1) Başlat menüsünde Donatılar / Windows Powershell altında bulunan Powershell ISE'yi başlatın. 2) Aşağıdakileri Powershell'e kopyalayıp yapıştırın:

#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) Komut dosyasına hangi sürücünün aranacağını ve nelerin yürütüleceğini söylemek için yukarıdaki komut dosyasını değiştirmeniz gerekir. Değiştirilecek iki satır:

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

'Mirror' isimli usb sabit sürücüm Z: sürücüsü olarak ayarlandı. Sadece kullanabilirsiniz if ($driveLabel -eq 'MyDiskLabel')mektubun umursamadığını eğer.

start-process "Z:\sync.bat"

Yapmak istediğiniz işin yolu. Örneğimde, USB sürücümde 3-4 yedekleme görevi komut satırı başlatan bir toplu iş dosyası oluşturdum.

4) İşiniz bittiğinde, komut dosyanızı bir yere kaydedin (uzantı .ps1), daha sonra komut dosyanızın arka planda çalışmasını sağlamak için Görev Zamanlayıcı'da bir görev oluşturun. Benimki şuna benziyor:

  • Tetik: Oturum açıldığında
  • Eylem: Bir program başlatın
  • Program / script: powershell
  • Argüman ekle: -ExecutionPolicy Unrestricted -File "D:\Stuff\Backup script.ps1"

5) Voilà!

6) Ekstra şeyler:

Komut dosyası pencerenizin gizlenmesini istiyorsanız, şu argümanları kullanın:

  • Argüman ekle:
    -WindowStyle Hidden -ExecutionPolicy Unrestricted -File "D:\Stuff\Backup script.ps1"

Komut dosyası iletilerini bir günlük dosyasına (komut dosyası her başlatıldığında, yani oturum açıldığında üzerine yazılan) yazdırmak istiyorsanız, aşağıdaki görev işlemini kullanın:

  • Program / script: cmd
  • Argümanları ekle:
    /c powershell -WindowStyle Hidden -ExecutionPolicy Unrestricted -File "D:\Stuff\Backup script.ps1" > "D:\Stuff\script log.txt "

Çalışan gizli betiği sonlandırmak istediğinizde, Görev Yöneticisi'nde "Powershell" işlemini sonlandırabilirsiniz.

Tek dezavantajı, sürücüyü önceden takılıyken bilgisayarınızı başlattığınızda hiçbir şeyin çalışmadığıdır.


Bence bu harika çalışacak.
Bağışlamama

1
Sürücüler için çalışıyor. Nasıl algılamak için bu değiştirebilir herhangi bir USB cihazı sadece sürücüler takılı değil?
GiantDuck

EventType 2 herhangi bir cihazın geldiğini algılar. Ayrıntıları almak için olaya biraz daha fazla bakmanız gerekir. En basit olanı $newEvent.SourceEventArgs.NewEventilgilendiğiniz etkinliklerin üyelerini basmak olabilir .
harrymc

Neredeyse 4 yıl sonra umut verici bir cevap görmek güzel :) Çok teşekkür ederim, GiantDuck & harrymc.
gemisigo

@harrymc Bunun için bir içerik sağlayabilir misiniz? Daha önce hiç powershell kullanmamıştım. Teşekkürler!
GiantDuck

6

Bu tartışma hakkında zaten açıkladığım gibi (ancak bir USB sürücüsü çıkarıldığında bir programı çalıştırmak üzereydi), USB Güvenle Kaldır , ücretsiz olmamakla birlikte, USB aygıtlarıyla ilgili bazı olaylar tetiklendiğinde bir programı çalıştırabilir:

Başka bir USB Güvenle Kaldırma özelliği, onu benzer yazılımlardan ayıran bir özellik, yalnızca bir cihazı bağladıktan sonra değil , aynı zamanda çıkarmadan önce tüm uygulamaları başlatıyor. Otomatik çalıştırma özelliği, çıkarılabilir bir sabit sürücünün bağlantısını kesmeden önce veri yedeklemenizi, Total Commander'ı kalem sürücünün içeriğiyle çalıştırmanızı, USB medyanın bağlantısını kesmeden önce otomatik olarak şifrelenmiş bir TrueCrypt sürücüsünün bağlantısını kesmenizi sağlar.

görüntü tanımını buraya girin

Tabii ki, bu planlanmış görevleri kullanmakla ilgili olmadığı için soruyu tam olarak cevaplamıyor, ancak amaç aynı, bir USB çubuğu takıldığında belirli bir programı çalıştırmak olduğunu düşünüyorum.


Çok teşekkür ederim, iyi bir geçici çözüm, öyle. Denedim ama düzgün çalışmasına rağmen hala orijinal hedefime ulaşmaya çalışıyorum (yani, yerel olarak mevcut ve ücretsiz bir çözüm kullanarak). Şimdiye kadar DriverFrameworks-UserMode Event ID 2006 olaylarını kullanarak eylemi tetikleyebileceğimi öğrendim. Yine de mükemmel değil. Gerekli bilgileri olay ayrıntılarında bulabilirsiniz, ancak belirli bir USB sürücü için filtreleyemiyorum, bu nedenle herhangi bir USB sürücüye takmak tetikleyicinin yanmasına neden olur.
gemisigo

5

EventVwr kullanarak oldukça kolay olmalı.

  1. İstediğiniz etkinliği bulun - Bir USB yığın depolama aygıtı taktığımda, aşağıdaki olayları tetikledi (uygulama kategorisi altında): 20001, 20003, 7036 ve daha az ilgili başka şeyler. Yanlış pozitifleri önlemek için bu olayları diğer USB cihazları olaylarına karşı test ettiğinizden emin olun.

  2. olaya sağ tıklayın ve "Bu olaya görev ekle" yi tıklayın (yalnızca Windows Vista veya üstü ile ilgili - XP için CLI EventTrigger var), "Bir Program Başlat" ı seçin ve çalıştırmak istediğiniz komut dosyasına yönlendirin.

  3. Komut dosyasına geçmek için ihtiyaç duyduğunuz olay parametrelerinin bu makalede görünmesi gerekir . 20001 ve 20003 olaylarına göre, UNC'nin yeni depoya giden yolunu bulabilirsiniz. Sysinternals Junction yardımcı programını kullanarak UNC yollarına bağlantılar oluşturabilirsiniz.


Bunun fikrini seviyorum, ancak yeterince ayrıntılı değil; Çalışmasını sağlayamıyorum.
GiantDuck

@GiantDuck Benim için gayet açık görünüyor, neyin detaylandırılmasını istersiniz?
EliadTech

Olayları Olay Görüntüleyicisi'nde bulamıyorum. (Şu anda Win8'de) Tam yol nedir? Teşekkür ederim!
GiantDuck

Yukarıda belirtilen olay numaralarıyla 'uygulama' günlüğü altında yazdım. Ama bunu Win7'de test ettim, bu yüzden belki Win8'de etkinlik numaraları farklıdır. Söylediğim gibi, taktığınız herhangi bir cihazla çalışabilmesini sağlamak için yine de bazı testler yapmanız gerekecek.
EliadTech

1
Win10'da Uygulama kategorisinde hiçbir şey görünmedi. Sisteme gitmek ve Olay Kimliği 98'e bağlanmak zorunda kaldım. Benim için sorun değil çünkü sadece bir cihaza sahip olacağım, ancak diğerleri çalışmayabilir
dbinott

2

Bunu çalıştırabildim: uygulama 1003 olayını uygulama ve servis kayıtlarında buldum, USB'ye bağlı bir telefon için Microsoft-Windows-DriverFrameworks-UserMode

Etkinliğin tam xml'si:

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

Ve görevim için özel etkinlik filtresi:

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

Benzer şekilde, bir USB sürücü için olay 2100, 2101, 2105, 2106 idi.
Belirli bir USB Sürücü için:

- <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 sürücümü taktığımda olay 2101 biraz farklı etiketlerle 3 kez oluyor gibi görünüyor :

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

Bunun ne anlama geldiği hakkında hiçbir fikrim yok, ancak burada birden fazla tetikleyiciden kaçınmak için bunlardan yalnızca biri için bir filtre var: (bu yalnızca bu USB sürücü için tetiklenir)

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

Ve işaretçilerin olduğu gibi kaçılması gerektiğini unutmayın. &amp;


1

Diğerlerinin de belirttiği gibi, Servis Kontrol Yöneticisinden Sistem günlüğü Olayı 7036'nın takılan bir USB sürücüyle güvenilir bir şekilde ilişkili olan tek olay olduğu görülmektedir. Bunu bir USB sürücü takarak ve son bir saat içinde tüm kaynaklardan gelen tüm olay günlüğü girişlerini listelemek için aşağıdaki powershell komutunu çalıştırarak kontrol ettim:

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

Maalesef, Event 7036, Hizmet Denetim Yöneticisi her hizmeti başarıyla başlattığında veya durdurduğunda üretilir, bu nedenle ek filtreleme gerekir.

Olay Görüntüleyicisi / Görev Zamanlayıcısı'nın GUI'sinde mevcut olan filtreleme oldukça basit bir işlemdir ve olay verilerini filtrelemeye izin vermez - yalnızca bu durumda size hangi hizmet hakkında bir şey söylemediğini gösteren meta verileri filtrelemenizi sağlar. durum değişti ve hangi duruma geçti. Bu, EventData'nın "param1" ve "param2" sinde tutulur. Bu nedenle, aşağıdaki XPath filtresi yalnızca başlangıçtaki ilgili hizmeti yakalamak için kullanılabilir:

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

Buradan betiğinizi çalıştırabilirsiniz, takılı olan USB sürücünün ilgilendiğiniz sürücü olup olmadığını kontrol etmek için bir miktar mantık daha ideal.


0

Uygulamalar ve Hizmet Günlükleri-Microsoft-Windows-Ntfs_Operational altında bulunan olay günlüğünden daha iyi bir olay (IMO) buldum. Eventid 4. Şuna benziyor:

Olay KIMLIĞI 4 NTFS birimi başarıyla bağlandı.

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

Bundan zamanlanmış bir görev tetikleyicisi oluşturabilir ve birim adına ve / veya etikete göre filtreleyebilirsiniz. Bu olay bir Windows Server 2019 kutusunda bulundu, ancak nedense Windows 10 (1809) masaüstünde göremiyorum. Bir sunucu sadece olay olabilir ....

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.