<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; HTA: Отслеживание USB накопителя]]></title>
		<link>https://forum.script-coding.com/viewtopic.php?id=10181</link>
		<atom:link href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=10181&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «HTA: Отслеживание USB накопителя».]]></description>
		<lastBuildDate>Thu, 04 Dec 2014 22:22:53 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: HTA: Отслеживание USB накопителя]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=88890#p88890</link>
			<description><![CDATA[<p>Пока разбирался с VBS (моя вечная проблема) сваял приблуду (в Линуксе такое видел):</p><div class="codebox"><pre><code>&lt;html&gt;
&lt;head&gt;
  &lt;hta:application applicationName=&quot;USBDL-Zs&quot; showInTaskbar=&quot;no&quot; singleInstance=&quot;yes&quot; /&gt;
  &lt;script type=&quot;text/jscript&quot; language=&quot;JScript&quot;&gt;moveTo(-10000,-10000);&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;&lt;object id=&quot;os&quot; classid=&quot;CLSID:75718C9A-F029-11D1-A1AC-00C04FB6C223&quot;&gt;&lt;/object&gt;&lt;/body&gt;
&lt;script type=&quot;text/jscript&quot; language=&quot;JScript&quot;&gt;
  var
   c=[],    // массив существующих линков
   d,        // массив USB накопителей
   f=new ActiveXObject(&#039;Scripting.FileSystemObject&#039;),
   s=new ActiveXObject(&#039;WScript.Shell&#039;),
   t=f.getFolder(s.specialFolders.item(10)),
   o;        // WMI

  try{o=GetObject(&#039;winmgmts:root\\cimv2&#039;);}
  catch(e){alert(&#039;Не удалось соединиться с WMI&#039;);window.close();}
  o.execNotificationQueryAsync(os,
   &#039;SELECT * FROM __InstanceOperationEvent WITHIN 1 WHERE TargetInstance ISA &#039;+
   &#039;&quot;Win32_USBControllerDevice&quot;&#039;
  );
  fc();

  function fa(e){                // создаём ярлык
    var u=t.path+&#039;\\USB диск &#039;+e+&#039;.lnk&#039;;
    with(s.createShortcut(u)){
      targetPath=e+&#039;:&#039;;
      save();
    }c.push(u);
  }
  function fb(){                // удаляем линки
    if(!c.length)with(new Enumerator(t.files)){
      while(!atEnd()){                // читаем линки
        if(/USB\sдиск\s\w\.lnk/.test(item().name))c.push(item().path);
        moveNext();
      }
    }
    for(var i=0;i&lt;c.length;i++)if(f.fileExists(c[i]))f.deleteFile(f.getFile(c[i]),true);
    c=[];
  }
  function fc(){                // перечитываем диски
    fb();                    // удаляем линки
    d=[];
    with(new Enumerator(f.drives)){        // читаем диски
      while(!atEnd()){
        if(item().driveType==1)d.push(item().driveLetter);
        moveNext();
      }
    }for(var i=0;i&lt;d.length;i++)fa(d[i]);    // создаём линки
  }
&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot; language=&quot;javascript&quot; for=&quot;os&quot; event=&quot;onobjectready()&quot;&gt;
  fc();
&lt;/script&gt;
&lt;/html&gt;</code></pre></div><p>Предполагается, что этот .hta стартует вместе с системой и с ней же завершается, поэтому прибить его можно только из Диспетчера задач. Кодировка 1251 (на всякий случай).<br /><strong>Poltergeyst</strong>, спасибо за пример.</p>]]></description>
			<author><![CDATA[null@example.com (Serge Yolkin)]]></author>
			<pubDate>Thu, 04 Dec 2014 22:22:53 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=88890#p88890</guid>
		</item>
		<item>
			<title><![CDATA[HTA: Отслеживание USB накопителя]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=88596#p88596</link>
			<description><![CDATA[<p><em>Без гарантий. Используете на свой страх и риск.</em></p><p>Скрипт предназначен для слежения за подключением/отключением Flash USB накопителя и основан на интерфейсе WMI. События подключения, останова и физического извлечения накопителя, подтверждаются соответствующими сообщениями. Желательно запускать скрипт при включенном и опознанном накопителе, либо при программно остановленном и удаленном из USB разъема компьютера.</p><p>Lang. HTA + VBScript<br />OC WinXP</p><p><strong>usbwatch.hta</strong><br /></p><div class="codebox"><pre><code>
&lt;HTML&gt;
&lt;TITLE&gt;USB Watch&lt;/TITLE&gt;
&lt;HEAD&gt;
&lt;META HTTP-EQUIV=Content-Type content=&#039;text/html;charset=windows-1251&#039;&gt;
&lt;HTA:APPLICATION
CAPTION=&#039;YES&#039;
CONTEXTMENU=&#039;NO&#039;
INNERBORDER=&#039;NO&#039;        
NAVIGABLE=&#039;NO&#039;        
SELECTION=&#039;NO&#039;        
SHOWINTASKBAR=&#039;YES&#039;    
SINGLEINSTANCE=&#039;YES&#039;    
SYSMENU=&#039;YES&#039;
WINDOWSTATE=&#039;normal&#039; 
/&gt;

&lt;STYLE type=text/css&gt;
BODY {cursor: hand; background-color: #c0c0c0;}

INPUT.headbtn     {
            position: absolute;
            left: 10px; 
            width: 150px; 
            height: 20px; 
            border: 1px;
            border-style: outset;
            background-color: #c0c0c0;
            font-family: MS Sans Serif; 
            font-size: 11px;
            font-weight: bold;
            cursor: hand; 
            
        }

&lt;/STYLE&gt;
&lt;/HEAD&gt;

&lt;BODY SCROLL=&quot;NO&quot;&gt;

    &lt;!---------------------------------------------------------------------------------&gt;
    &lt;OBJECT ID=&quot;ObjSink&quot; 
        STYLE=&quot;position:absolute;top:0;left:0;width:0;height:0&quot;
        CLASSID=&quot;CLSID:75718C9A-F029-11D1-A1AC-00C04FB6C223&quot;&gt;
    &lt;/OBJECT&gt;
    
    &lt;INPUT TYPE=BUTTON ID=&#039;btn1&#039; 
            class=&#039;headbtn&#039; 
            VALUE=&#039;Извлечь&#039; style=&#039;top: 10px;&#039;
            onclick=&#039;UnplugDialog()&#039;&gt;
    &lt;P&gt;
    &lt;INPUT TYPE=BUTTON ID=&#039;btn2&#039;
            class=&#039;headbtn&#039; 
            VALUE=&#039;Выход&#039; style=&#039;top: 40px;&#039;
            onclick=&#039;window.close();&#039;&gt;
    &lt;!---------------------------------------------------------------------------------&gt;
    &lt;SCRIPT LANGUAGE=&quot;VBScript&quot;&gt;

        Public StateFlag
        Public sPrevDrivesStr
        Public objService, objProc

        Set objService = GetObject(&quot;winmgmts:root\cimv2&quot;)
        Set objProc = objService.Get(&quot;Win32_Process&quot;)
        
        lW = window.screen.width
        lH = window.screen.height
            window.moveTo lW - 180, 0
            window.resizeTo 180, 100
        
        StateFlag = False
        GetDriveLetter False    &#039;Определение первоначального состояния съемных накопителей

        &#039;/Выполнить запрос асинхронного отслеживания WMI/
        &#039;---------------------------------------------------------------------------
        objService.ExecNotificationQueryAsync ObjSink, _
        &quot;SELECT * FROM __InstanceOperationEvent WITHIN 1 WHERE TargetInstance ISA &quot;&quot;Win32_USBControllerDevice&quot;&quot;&quot;
        
        &#039;/Получение буквы съемного Flash USB диска/
        &#039;---------------------------------------------------------------------------
        Function GetDriveLetter(flg)
            
            Dim sDrivesStr
            Dim sDev
            Dim sCur1, sCur2
            Dim a,b

            On Error Resume Next

            &#039;/Перебор букв дисков/
            &#039;---------------------------------------------------------------------------------
            sDrivesStr = &quot;&quot;
            Set objRemovableDrives = objService.ExecQuery(&quot;SELECT * FROM Win32_LogicalDisk WHERE DriveType = 2&quot;)
            
            For Each objDrive In objRemovableDrives
                sDrivesStr = sDrivesStr &amp; CStr(objDrive.DeviceId)
            Next

            &#039;/Выяснение буквы добавленного или удаленного диска/
            &#039;-------------------------------------------------------------------
            If flg = True Then

                a = (Len(sDrivesStr) &gt; Len(sPrevDrivesStr)) &#039;Добавление устройства
                b = (Len(sDrivesStr) &lt; Len(sPrevDrivesStr)) &#039;Извлечение устройства
                sCur1 = sDrivesStr
                sCur2 = sPrevDrivesStr

                For Each objDrive In objRemovableDrives

                    sDev = CStr(objDrive.DeviceId)
                    
                    &#039;/Добавление устройства/
                    If a Then
                        If (InStr(sDrivesStr,sDev)&lt;&gt;0) And Not (InStr(sPrevDrivesStr,sDev)&lt;&gt;0) Then GetDriveLetter = sDev: Exit For
                    End If
                    
                    &#039;/Извлечение устройства/
                    If b Then
                        sCur1 = Replace(sCur1, sDev, &quot;&quot;)
                        sCur2 = Replace(sCur2, sDev, &quot;&quot;)
                    End If

                Next    
                If b Then
                    If Len(sCur1) &lt; Len(sCur2) Then GetDriveLetter = sCur2
                End If
            End If
            &#039;-------------------------------------------------------------------
            sPrevDrivesStr = sDrivesStr
            If Err.Number &lt;&gt; 0 Then GetDriveLetter = &quot;&quot;
            Err.Clear
        
        End Function

        &#039;/Обработка событий вставки-извлечения/
        &#039;---------------------------------------------------------------------------
        Sub ObjSink_OnObjectReady(objWbemObject, objContext)    &#039;Подключение
            
            Dim sEventType, sDepend
            Dim a,b,c

             sEventType = CStr(objWbemObject.Path_.Class)
            sDepend = CStr(objWbemObject.TargetInstance.Dependent)

            &#039;/Условия/
            &#039;-------------------------------------------------------------------
            a = (InStr(1, sEventType, &quot;CreationEvent&quot;) &lt;&gt; 0)
            b = (InStr(1, sEventType, &quot;DeletionEvent&quot;) &lt;&gt; 0)
            c = (InStr(1, sDepend, &quot;USBSTOR&quot;) &lt;&gt; 0)
            
            &#039;-------------------------------------------------------------------
            If a And c Then
                StateFlag = False
                MsgBox &quot;Подключен USB накопитель. [&quot; &amp; GetDriveLetter(True) &amp; &quot;]&quot;, vbInformation Or vbSystemModal, &quot;Reply&quot;
                
            End If
            
            If b Then

                If StateFlag Then
                    StateFlag = False
                    If InStr(sDepend,&quot;VID&quot;)&lt;&gt;0 Then    MsgBox &quot;USB устройство отстыковано аппаратно.&quot;, vbInformation Or vbSystemModal, &quot;Reply&quot;
                End If
    
                If c Then
                    StateFlag = True
                    MsgBox &quot;USB накопитель отключен программно или небезопасно отстыкован. [&quot; &amp; GetDriveLetter(True) &amp; &quot;]&quot;, vbInformation Or vbSystemModal, &quot;Reply&quot;
                End If
                    
                
            End If
        End Sub
        
        &#039;/Вызов диалога безопасного извлечения устройства/
        &#039;---------------------------------------------------------------------------
        Sub UnplugDialog()

            On Error Resume Next
            objProc.Create &quot;rundll32.exe shell32,Control_RunDLL hotplug.dll&quot;, null, null, pID

        End Sub
        &#039;---------------------------------------------------------------------------
        Function window_onunload()

            ObjSink.Cancel()
            Set objService = Nothing
            Set objProc = Nothing

        End Function

        &#039;---------------------------------------------------------------------------
        Function window_onload()
        
        End Function

    &lt;/SCRIPT&gt;
    &lt;!---------------------------------------------------------------------------------&gt;
&lt;/BODY&gt;
&lt;/HTML&gt;
</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (Poltergeyst)]]></author>
			<pubDate>Sun, 23 Nov 2014 15:08:35 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=88596#p88596</guid>
		</item>
	</channel>
</rss>
