USB डिवाइस के कनेक्शन का पता लगाकर निर्धारित कार्य शुरू करना


24

मुझे पता है कि यह चर्चा की गई है कि विन 7. में ऑटोरन (या ऑटोप्ले ??) की सीमाओं के कारण कनेक्शन पर एक यूएसबी ड्राइव से एप्लिकेशन शुरू करना संभव नहीं है। लेकिन एक इवेंट टाइप ट्रिगर होने के लिए एक अनुसूचित कार्य बनाना संभव है । निश्चित रूप से एक घटना होनी चाहिए जब ड्राइव - या किसी भी यूएसबी डिवाइस, उस मामले के लिए - जुड़ा हुआ है।

किसी को भी मामूली विचार है कि मुझे किस इवेंट आईडी का उपयोग करना चाहिए? या कम से कम किस प्रकार का आयोजन? मुझे इवेंट व्यूअर में इवेंट कहां मिल सकता है?

जवाबों:


17

थ्रेड टास्क समयबद्धक: मेरे USB फ्लैश ड्राइव को स्वचालित रूप से कैसे सिंक्रनाइज़ किया जाए? मोनोटोन नामक उपयोगकर्ता द्वारा इसका उत्तर दिया गया है, जो टास्क शेड्यूलर के साथ मिलकर PowerShell का उपयोग करता है:

मेरे पास आपके जैसा ही प्रश्न था, और यहां और यहां स्क्रिप्टिंग गाइ ब्लॉग की तकनीकों का उपयोग करते हुए पावरशेल (विंडोज़ में निर्मित स्क्रिप्टिंग) के साथ कुछ काम किया । स्क्रिप्ट एक पृष्ठभूमि प्रक्रिया के रूप में लगातार चलती है, जिसे आप कार्य शेड्यूलर के साथ सिस्टम लॉगऑन पर शुरू कर सकते हैं। जब भी कोई नया ड्राइव प्लग किया जाता है, तब स्क्रिप्ट को सूचित किया जाएगा और फिर कुछ किया जाएगा (यहां आप कार्य के बजाय स्क्रिप्ट को कॉन्फ़िगर करते हैं)। चूंकि यह मूल रूप से अगले प्लग किए गए ड्राइव की प्रतीक्षा करते समय रोका जाता है, इसलिए आपको यह नहीं पता होना चाहिए कि यह बहुत अधिक संसाधन लेता है। लो मैं चला:

1) पॉवर्सशेल ISE ​​शुरू करें, जो एक्सेसरीज / विंडोज पॉवर्सशेल के तहत आपके स्टार्ट मेनू में पाया जा सकता है। 2) पॉवर्सशेल में निम्नलिखित को कॉपी पेस्ट करें:

#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')

'मिरर' नाम की मेरी USB हार्ड ड्राइव को Z: ड्राइव के रूप में सेट किया गया है। if ($driveLabel -eq 'MyDiskLabel')यदि आप पत्र के बारे में परवाह नहीं करते तो आप इसका उपयोग कर सकते हैं ।

start-process "Z:\sync.bat"

आप जो भी कार्य करना चाहते हैं उसका पथ। मेरे उदाहरण में, मैंने अपने यूएसबी ड्राइव पर एक बैच फ़ाइल बनाई है जो 3-4 बैकअप कार्य कमांड लाइन शुरू करती है।

4) जब आप काम कर रहे हों .ps1, तो अपनी स्क्रिप्ट को कहीं और सेव करें (विस्तार ), फिर टास्क शेड्यूलर में एक टास्क बनाएं ताकि आपकी स्क्रिप्ट बैकग्राउंड में चले। मेरा ऐसा दिखता है:

  • ट्रिगर: लॉग ऑन पर
  • क्रिया: एक कार्यक्रम शुरू करें
  • कार्यक्रम / स्क्रिप्ट: शक्तियां
  • तर्क जोड़ें: -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 "

कभी भी आप छिपी हुई स्क्रिप्ट को समाप्त करना चाहते हैं, आप टास्क मैनेजर में "पॉवर्सशेल" प्रक्रिया को समाप्त कर सकते हैं।

केवल नकारात्मक पक्ष यह है कि जब आप पहले से प्लग किए गए ड्राइव के साथ अपने कंप्यूटर को बूट करते हैं तो कुछ भी नहीं चलेगा। (स्क्रिप्ट को शुरू में पहला चेक करने के लिए बदला जा सकता है, लेकिन आज के लिए मेरे पास पर्याप्त है!)


मुझे लगता है कि यह बहुत अच्छा काम करेगा। मुझे इसके साथ छेड़छाड़ करने दो और मैं तुम्हारे पास वापस आ
जाऊंगा

1
यह ड्राइव के लिए काम कर रहा है। मैं किसी भी USB डिवाइस का पता लगाने के लिए इसे कैसे संशोधित कर सकता हूं , और न केवल ड्राइव?
जाइंटडक

EventType 2 किसी भी डिवाइस के आगमन का पता लगाएगा। विवरण प्राप्त करने के लिए घटना में कुछ और खुदाई की आवश्यकता होगी। सबसे सरल हो सकता है कि $newEvent.SourceEventArgs.NewEventआप जिन घटनाओं में रुचि रखते हैं, उनके सदस्यों को प्रिंट करें ।
harrymc

लगभग 4 साल बाद एक आशाजनक जवाब देखकर अच्छा लगा :) बहुत बहुत धन्यवाद, GiantDuck और harrymc।
जेमिसिगो

@harrymc क्या आप उसके लिए कुछ संदर्भ प्रदान कर सकते हैं? मैंने पहले कभी पॉवरशेल का उपयोग नहीं किया है। धन्यवाद!
विशालकाय

6

जैसा कि मैंने पहले ही इस चर्चा के बारे में बताया था (लेकिन यह USB ड्राइव हटाए जाने पर एक कार्यक्रम चलाने के बारे में था), USB सुरक्षित रूप से निकालें , हालाँकि मुफ्त नहीं, USB उपकरणों के बारे में कुछ घटनाओं के शुरू होने पर एक कार्यक्रम चला सकते हैं:

एक अन्य USB सुरक्षित रूप से समान सुविधा है जो इसे समान सॉफ़्टवेयर से अलग करती है, न केवल किसी डिवाइस को जोड़ने के बाद , बल्कि इसे हटाने से पहले किसी भी एप्लिकेशन को शुरू कर रही है। ऑटोरन सुविधा आपको हटाने योग्य हार्ड ड्राइव को डिस्कनेक्ट करने से पहले डेटा बैकअप सेट करने की अनुमति देती है, कुल कमांडर को पेन-ड्राइव की सामग्री के साथ चलाने के लिए, यूएसबी मीडिया को डिस्कनेक्ट करने से पहले एक एन्क्रिप्टेड ट्रू क्रिप्टिप ड्राइव को स्वचालित रूप से अनमाउंट करें।

यहां छवि विवरण दर्ज करें

बेशक, यह पूरी तरह से सवाल का जवाब नहीं देता है, क्योंकि यह अनुसूचित कार्यों का उपयोग करने के बारे में नहीं है, लेकिन लक्ष्य एक ही है, मुझे लगता है, जो एक विशिष्ट कार्यक्रम चलाना है जब एक यूएसबी स्टिक प्लग किया जाता है।


बहुत बहुत धन्यवाद, एक अच्छा समाधान है, यह है। मैंने इसे आज़माया है, लेकिन इसके बावजूद यह ठीक से काम कर रहा है, मैं अभी भी अपने मूल लक्ष्य को प्राप्त करने की कोशिश कर रहा हूं (यानी, मूल रूप से उपलब्ध और मुफ्त समाधान का उपयोग करके)। अब तक मुझे पता चला है कि DriverFrameworks-UserMode से इवेंट ID 2006 इवेंट का उपयोग करके मैं कार्रवाई को ट्रिगर कर सकता हूं। हालांकि यह अभी भी सही नहीं है। आवश्यक जानकारी ईवेंट विवरण में उपलब्ध है, लेकिन मैं इसे किसी विशिष्ट USB ड्राइव के लिए फ़िल्टर नहीं कर सकता, इसलिए किसी भी USB ड्राइव में प्लग करने से ट्रिगर आग हो जाएगी।
जेमिसिगो

5

EventVwr का उपयोग करके यह काफी आसान होना चाहिए।

  1. इच्छित ईवेंट ढूंढें - जब मैंने USB मास स्टोरेज डिवाइस को प्लग इन किया तो यह निम्न घटनाओं (एप्लिकेशन श्रेणी के तहत) को ट्रिगर करता है: 20001, 20003, 7036 और कुछ अन्य कम प्रासंगिक। सुनिश्चित करें कि आप झूठी सकारात्मकता से बचने के लिए अन्य USB उपकरणों की घटनाओं के खिलाफ उन घटनाओं का परीक्षण करें।

  2. इवेंट पर राइट क्लिक करें और "इस इवेंट में अटैच टास्क" पर क्लिक करें (केवल Windows Vista या उससे अधिक प्रासंगिक - XP के लिए CLI EventTrigger है), "एक प्रोग्राम प्रारंभ करें" चुनें और उस स्क्रिप्ट को इंगित करें जिसे आप चलाना चाहते हैं।

  3. स्क्रिप्ट को पास करने के लिए इस आलेख में आपके लिए आवश्यक पैरामीटर की जाँच करें । 20001 और 20003 की घटनाओं के तहत आप नए भंडारण के लिए UNC पथ पा सकते हैं। Sysinternals Junction की उपयोगिता का उपयोग करके आप UNC रास्तों के लिए लिंक बना सकते हैं।


मुझे इसका विचार पसंद है, लेकिन यह पर्याप्त विस्तृत नहीं है; मैं इसे काम नहीं कर सकता।
जायंटडक

@GiantDuck मेरे लिए यह बहुत सीधा-सीधा दिखता है, आप मुझे क्या बताना चाहेंगे?
एलियाडटेक

मुझे इवेंट व्यूअर में इवेंट्स नहीं मिले। (फिलहाल Win8 पर) सटीक रास्ता क्या है? धन्यवाद!
जाइंटडैक

मैंने लिखा, यह ऊपर उल्लिखित घटना संख्याओं के साथ 'एप्लिकेशन' लॉग के तहत है। लेकिन मैंने इसे Win7 पर टेस्ट किया है, इसलिए हो सकता है कि Win8 पर इवेंट नंबर अलग हों। जैसा कि मैंने कहा कि आपको यह सुनिश्चित करने के लिए कुछ परीक्षण करने की आवश्यकता होगी कि यह आपके द्वारा प्लग किए जा रहे किसी भी उपकरण के साथ काम करेगा।
एलियाडटेक

1
Win10 में एप्लिकेशन श्रेणी में कुछ भी नहीं दिखाई दिया। मुझे सिस्टम में जाना था और इवेंट आईडी 98 से अटैच करना था। यह मेरे लिए ठीक है क्योंकि मेरे पास केवल एक ही उपकरण होगा, लेकिन दूसरे काम नहीं कर सकते
dbinott

2

मैं यह काम करने में सक्षम था: मुझे एप्लिकेशन और सेवाओं के लॉग में इवेंट 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>

इसी तरह एक यूएसबी ड्राइव के लिए यह 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">

मुझे पता नहीं है कि इसका क्या मतलब है, लेकिन उनमें से केवल एक के लिए एक फ़िल्टर कई ट्रिगर्स से बचने के लिए है: (यह केवल इस विशिष्ट यूएसबी ड्राइव के लिए ट्रिगर होगा)

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

ध्यान दें कि ampersands के रूप में बच जाना चाहिए &amp;


1

जैसा कि दूसरों ने उल्लेख किया है, ऐसा लगता है कि सेवा नियंत्रण प्रबंधक से सिस्टम लॉग इवेंट 7036 एकमात्र घटना है जो यूएसबी ड्राइव के साथ विश्वसनीय रूप से सहसंबंधित है। मैंने अंतिम समय में सभी स्रोतों से सभी ईवेंट लॉग प्रविष्टियों को सूचीबद्ध करने के लिए एक यूएसबी ड्राइव सम्मिलित करके और निम्न अधिकार प्राप्त कमांड चलाकर इसकी जाँच की:

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

दुर्भाग्य से जब हर बार सेवा नियंत्रण प्रबंधक सफलतापूर्वक किसी भी सेवा को शुरू या बंद कर देता है, तो 7070 उत्पन्न होता है, इसलिए अतिरिक्त फ़िल्टरिंग की आवश्यकता होती है।

इवेंट व्यूअर / टास्क शेड्यूलर के जीयूआई में उपलब्ध फ़िल्टरिंग काफी बुनियादी है और ईवेंट डेटा पर किसी भी फ़िल्टरिंग की अनुमति नहीं देता है - यह आपको केवल मेटाडेटा पर फ़िल्टर करने देता है जो इस मामले में आपको कुछ नहीं बताता है कि किस सेवा के बारे में कुछ भी है बदल गया राज्य और यह किस राज्य में बदल गया है। यह 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>

वहां से आप अपनी स्क्रिप्ट चला सकते हैं, आदर्श रूप से कुछ अतिरिक्त तर्क के साथ यह जांचने के लिए कि यूएसबी ड्राइव जो डाला गया है वह वही है जिसमें आप रुचि रखते हैं।


0

मुझे एप्लिकेशन और सेवा लॉग-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

उस से आप एक निर्धारित कार्य ट्रिगर बना सकते हैं और वॉल्यूम नाम और या लेबल द्वारा फ़िल्टर कर सकते हैं। यह घटना विंडोज सर्वर 2019 बॉक्स पर पाई गई थी, हालांकि किसी कारण से मैं इसे अपने विंडोज 10 (1809) डेस्कटॉप पर नहीं देख रहा हूं। हो सकता है एक सर्वर केवल घटना हो…।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.