<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; Vbscript: определение залоченности пользователем системы]]></title>
		<link>https://forum.script-coding.com/viewtopic.php?id=6144</link>
		<atom:link href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=6144&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «Vbscript: определение залоченности пользователем системы».]]></description>
		<lastBuildDate>Sat, 17 Sep 2011 08:03:04 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: Vbscript: определение залоченности пользователем системы]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=51579#p51579</link>
			<description><![CDATA[<p>Спасибо огромное за проделанный труд - и за библиотеку и за скрипт с готовым приложением!</p>]]></description>
			<author><![CDATA[null@example.com (Rom5)]]></author>
			<pubDate>Sat, 17 Sep 2011 08:03:04 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=51579#p51579</guid>
		</item>
		<item>
			<title><![CDATA[Re: Vbscript: определение залоченности пользователем системы]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=51087#p51087</link>
			<description><![CDATA[<p>По мотивам поста получилось <a href="http://narod.ru/disk/23794080001/LockMaster.zip.html">вот такое HTA</a>.<br /><span class="postimg"><img src="http://da440dil.narod.ru/lockmaster-images/lockmaster.png" alt="http://da440dil.narod.ru/lockmaster-images/lockmaster.png" /></span> <span class="postimg"><img src="http://da440dil.narod.ru/lockmaster-images/lockmaster1.png" alt="http://da440dil.narod.ru/lockmaster-images/lockmaster1.png" /></span><br />Алгоритм следующий: <br />- вводим имя компьютера вручную (по умолчанию) или выбираем из списка компьютеров в сети (после нажатия на кнопку &quot;Выбрать&quot;)<br />- проверяем целевой компьютер на залоченность<br />- блокируем целевой компьютер в случае необходимости<br />Обошелся без Remote Scripting (хлопотно), PsExec и похожих фокусов с запуском службы (без Марка Руссиновича не обойтись), без планировщиков (долго ждать запуска процесса), только FSO и WMI. Ну и либу, конечно, на VB6 написал (исходник чуть выше).<br />Честно, не знаю что получилось, прошу заценить.<br />Код HTA:<br /></p><div class="codebox"><pre><code>&lt;html&gt;
&lt;head&gt;
  &lt;title&gt;LockMaster&lt;/title&gt;
  &lt;HTA:APPLICATION 
    ID = &quot;LockMaster&quot;
    APPLICATIONNAME=&quot;LockMaster&quot;    
    SINGLEINSTANCE=&quot;yes&quot;
    MAXIMIZEBUTTON = &quot;no&quot;
    SCROLL=&quot;no&quot;
    Icon = &quot;daffodil.ico&quot;
    Version = &quot;1.0&quot;&gt;
    &lt;/HTA:APPLICATION&gt;
    
&lt;style type=&quot;text/css&quot;&gt;
    body{
    color:#fff;
    font: bold sans-serif;
    }    
    .button{
    font: bold;
    color:#fff;
    background-color:000055; 
    width:150px; 
    height:35px;
    }
  &lt;/style&gt;
&lt;/head&gt;
&lt;script language=&quot;VBScript&quot;&gt;
On Error Resume Next
Dim bDivState
Dim objWMI, wshShell, fso
Const strAdmShareName = &quot;ADMIN$&quot; &#039;имя админской шары
Const strOption0 = &quot;Выберите компьютер&quot; &#039;первый option select-a - заголовок
Const strDll = &quot;DADeskTop.dll&quot; &#039;имя библиотеки
Const strScr = &quot;LockMaster.vbs&quot; &#039;имя скрипта
Const strLM = &quot;lm&quot; &#039;имя файла, в который пишется результат проверки на залоченность

&#039;процедура изменения размера окна при загрузке
Sub OnLoad()
    Window.ResizeTo 200, 200
    Window.MoveTo 20, 20
    &#039;чтобы при любом раскладе загрузился интерфейс
    Window.setTimeout &quot;FillCompInput&quot;,1, &quot;vbscript&quot;        
End Sub

&#039;выход из приложения - чистим ссылки
Sub Window_OnUnload()
    Set fso = Nothing
    Set wshShell = Nothing
    Set objWMI = Nothing
End Sub

&#039;процедура заполнения DIV-а INPUT-ом - окошком для ввода имени компьютера вручную и DIV-a кнопкой Выбрать     
Sub FillCompInput()
    strCompList.innerhtml = &quot;&lt;input id=&quot;&quot;txtComputer&quot;&quot; type=&quot;&quot;text&quot;&quot; /&gt;&quot;        
    buttons.innerhtml = &quot;&lt;input type=&quot;&quot;button&quot;&quot; class=&quot;&quot;button&quot;&quot;value=&quot;&quot;Выбрать&quot;&quot; onclick=&quot;&quot;FillCompList&quot;&quot;&gt;&quot;        
    bDivState = False &#039;ставим флаг
End Sub

Sub FillCompList()
    Dim objNameSpace, objComp, objDom
    Dim strHTMLCompList, strHTMLDomList, i        
    i = 0        
    &#039;первая строка списка компьютеров
    strHTMLCompList = &quot;&lt;select name=&quot;&quot;txtComputer&quot;&quot;&gt;&lt;option value=&quot; &amp; i &amp; &quot;&gt;&quot; &amp; strOption0 &amp; &quot;&lt;/option&gt;&quot;
    
    Set objNameSpace = GetObject(&quot;WinNT:&quot;)
    objNameSpace.Filter = Array(&quot;Domain&quot;) &#039;берем домены        
    For Each objDom In objNameSpace &#039;бежим по доменам            
        objDom.Filter = Array(&quot;Computer&quot;) &#039;берем компы домена
        For Each objComp In objDom &#039;бежим по компьютерам
            &#039;заполняем список компьютеров в домене - прочие OPTION-ы SELECT-a txtComputer
            strHTMLCompList = strHTMLCompList &amp; &quot;&lt;option value=&quot; &amp; i &amp; &quot;&gt;&quot; &amp; objComp.Name &amp; &quot;&lt;/option&gt;&quot;
            i = i + 1
        Next                        
    Next        
    Set objNameSpace = Nothing &#039;удалим ссылку
    
    strHTMLCompList = strHTMLCompList &amp; &quot;&lt;/select&gt;&quot;    &#039;закрываем тэг        
    strCompList.innerhtml = strHTMLCompList    &#039;заполним DIV
    &#039;изменим кнопку
    buttons.innerhtml = &quot;&lt;input type=&quot;&quot;button&quot;&quot; class=&quot;&quot;button&quot;&quot;value=&quot;&quot;Вручную&quot;&quot; onclick=&quot;&quot;FillCompInput&quot;&quot;&gt;&quot;        
    bDivState = True &#039;ставим флаг            
End Sub

&#039;нажатие на кнопку
Sub OnClickBtn(bChk)
    Dim strCompSelected
    If bDivState Then &#039;если в DIV-е SELECT             
        strCompSelected = txtComputer.Options(txtComputer.selectedIndex).Text
    Else &#039;если в DIV-е INPUT
        strCompSelected = txtComputer.Value
    End If
    
    &#039;--- проверки
    &#039;не пустое имя
    If strCompSelected = vbNullString Then
        MsgBox &quot;Введите имя компьютера&quot;
        Exit Sub
    &#039;не option 0
    ElseIf strCompSelected = strOption0 Then
        MsgBox &quot;Выберите имя компьютера&quot;
        Exit Sub    
    &#039;пингуем
    ElseIf Not CompAvailable(strCompSelected) Then
        MsgBox &quot;Компьютер &quot; &amp; strCompSelected &amp; &quot; не найден&quot;
        Exit Sub
    End If        
    
    &#039;подключаемся к WMI целевого компа
    Set objWMI = GetObject(&quot;winmgmts:{impersonationLevel=impersonate}!\\&quot; &amp; strCompSelected &amp; &quot;\Root\CIMV2&quot;)
    If Err.Number &lt;&gt; 0 Then
        MsgBox &quot;Не удалось подключиться к пространству имен CIMV2 компьютера &quot; &amp; _
                strCompSelected &amp; vbCrLf &amp; ConnectionErrors(Err.Number)
        Exit Sub
    End If
    
    &#039;сразу инициализируем, чтобы чистить все ссылки
    Set wshShell = CreateObject(&quot;WScript.Shell&quot;)
    Set fso = CreateObject(&quot;Scripting.FileSystemObject&quot;)    
    
    &#039;если выбран локальный компьютер
    If IsLocalComp() Then
        Window_OnUnload
        MsgBox &quot;Выберите удаленный компьютер&quot;
        Exit Sub
    &#039;проверяем наличие админской шары
    ElseIf Not HaveShare() Then
        Window_OnUnload
        MsgBox &quot;На компьютере &quot; &amp; strCompSelected &amp; &quot; не найден общий ресурс &quot; &amp; strAdmShareName
        Exit Sub
    End If
    
    &#039;собираем пути к файлам библиотеки и скрипта
    strDllPath = wshShell.CurrentDirectory &amp; &quot;\&quot; &amp; strDll
    strScrPath = wshShell.CurrentDirectory &amp; &quot;\&quot; &amp; strScr    
    
    &#039;проверяем наличие файла библиотеки в текущем каталоге
    If Not fso.FileExists(strDllPath) Then
        Window_OnUnload
        MsgBox &quot;Файл &quot; &amp; strDllPath &amp; &quot; не найден&quot;
        Exit Sub
    &#039;проверяем наличие файла скрипта в текущем каталоге
    ElseIf Not fso.FileExists(strScrPath) Then
        Window_OnUnload
        MsgBox &quot;Файл &quot; &amp; strScrPath &amp; &quot; не найден&quot;
        Exit Sub
    End If    
    
    &#039;копируем файлы на удаленный компьютер с заменой существующих
    bRet = fso.CopyFile(strDllPath, &quot;\\&quot; &amp; strCompSelected &amp; &quot;\&quot; &amp; strAdmShareName &amp; &quot;\&quot; &amp; strDll, True)
    If Not bRet Then
        Window_OnUnload
        MsgBox &quot;Не удалось скопировать файл &quot; &amp; strDll &amp; &quot; на компьютер &quot; &amp; strCompSelected
        Exit Sub
    End If
    bRet = fso.CopyFile(strScrPath, &quot;\\&quot; &amp; strCompSelected &amp; &quot;\&quot; &amp; strAdmShareName &amp; &quot;\&quot; &amp; strScr, True)
    If Not bRet Then
        Window_OnUnload
        MsgBox &quot;Не удалось скопировать файл &quot; &amp; strScr &amp; &quot; на компьютер &quot; &amp; strCompSelected
        Exit Sub
    End If
    
    &#039;пытаемся запустить процесс на удаленной машине
    bRet = CreateProcess(bChk, strScr)
    If Not bRet Then
        Window_OnUnload
        MsgBox &quot;Не удалось создать процесс на компьютере &quot; &amp; strCompSelected
        Exit Sub
    End If
    
    If bChk Then &#039;если проверка
        Set objFile  = fso.GetFile(&quot;\\&quot; &amp; strCompSelected &amp; &quot;\&quot; &amp; strAdmShareName &amp; &quot;\&quot; &amp; strLM)
        If Err.Number &lt;&gt; 0 Then
            Window_OnUnload
            MsgBox &quot;Не удалось получить файл &quot; &amp; &quot;\\&quot; &amp; strCompSelected &amp; &quot;\&quot; &amp; strAdmShareName &amp; &quot;\&quot; &amp; strLM
            Exit Sub
        End If
        If objFile.Size = 0 Then
            Window_OnUnload
            MsgBox &quot;Файл &quot; &amp; &quot;\\&quot; &amp; strCompSelected &amp; &quot;\&quot; &amp; strAdmShareName &amp; &quot;\&quot; &amp; strLM &amp; &quot; - пустой&quot;
            Exit Sub
        End If
        &#039;открываем файл для чтения
        Set f = fso.OpenTextFile(objFile.Path,1)
        Set objFile = Nothing
        &#039;читаем файл
        strContents = Trim(f.ReadLine)
        f.Close &#039;закрываем файл
        Set f = Nothing
        &#039;проверяем длину строки может быть только True или False
        If Len(strContents) &gt; 5 Then
            Window_OnUnload
            MsgBox &quot;Не удалось прочитать содержание файла &quot; &amp; &quot;\\&quot; &amp; strCompSelected &amp; &quot;\&quot; &amp; strAdmShareName &amp; &quot;\&quot; &amp; strLM
            Exit Sub
        End If
        &#039;проверяем содержимое файла
        If CBool(strContents) Then &#039;если True
            MsgBox &quot;Компьютер &quot; &amp; strCompSelected &amp; &quot; заблокирован&quot;
        Else
            MsgBox &quot;Компьютер &quot; &amp; strCompSelected &amp; &quot; не заблокирован&quot;
        End If
    Else &#039;если лочим
        MsgBox &quot;Компьютер &quot; &amp; strCompSelected &amp; &quot; успешно заблокирован&quot;
    End If
    
End Sub    

&#039;запускаем процесс на удаленном компе
Function CreateProcess(bChk, strScr)
    Set objStartup = objWMI.Get(&quot;Win32_ProcessStartup&quot;)    
    Set objConfig = objStartup.SpawnInstance_
    objConfig.ShowWindow = 0 &#039;не показываем окно процесса
    &#039;если лочим комп - добавим к запуску скрипта параметр /l
    If Not bChk Then strScr = strScr &amp; &quot; /l&quot; 
    Set objProcess = objWMI.Get(&quot;Win32_Process&quot;)
    intRet = objProcess.Create(strScr, Null, objConfig, intProcessID)
    Set objProcess = Nothing
    Set objConfig = Nothing
    Set objStartup = Nothing
    If intRet = 0 Then        
        CreateProcess = True        
    Else
        CreateProcess = False
    End If    
End Function

&#039;проверка наличия компа в сети при помощи пинга
Function CompAvailable(strCompName)        
    Dim objPing, objStatus    
    CompAvailable = False &#039;значение по умолчанию на случай ошибки
    &#039;выполняем запрос из локального WMI
    Set objPing = GetObject(&quot;winmgmts:\\.\Root\CIMV2&quot;).ExecQuery _
            (&quot;Select * from Win32_PingStatus Where Address = &#039;&quot; &amp; strCompName &amp; &quot;&#039;&quot;)        
    For Each objStatus in objPing
        If objStatus.StatusCode = 0 Then CompAvailable = True            
    Next
    Set objPing = Nothing
End Function

&#039;функция проверки наличия у компа админской шары
Function HaveShare()
    Dim colShares, objShare
    HaveShare = False &#039;значение по умолчанию
    Set colShares = objWMI.ExecQuery(&quot;Select * from Win32_Share Where Name = &#039;&quot; &amp; strAdmShareName &amp; &quot;&#039;&quot;)    
    For Each objShare In colShares
        HaveShare = True
    Next
    Set colShares = Nothing        
End Function

&#039;функция проверки, является ли текущий комп локальным
Function IsLocalComp()    
    Set objWinOS = objWMI.ExecQuery(&quot;SELECT * FROM Win32_OperatingSystem&quot;)    
    For Each objObj In objWinOS        
        strCSName = objObj.CSName &#039;Name of the scoping computer system            
    Next    
    Set objWinOS = Nothing        
    IsLocalComp = False        
    If strCSName = wshShell.ExpandEnvironmentStrings(&quot;%COMPUTERNAME%&quot;) Then IsLocalComp = True    
End Function

&#039;ловим ошибки подключения
Function ConnectionErrors(zn)
    Dim res
    Select Case zn
        Case -2147217400
            res = &quot;Ошибка подключения&quot;
        Case -2147749891
            res = &quot;Неверные учетные данные пользователя&quot;            
        Case -2147749902
            res = &quot;Не найдено пространство имен&quot;
        Case -2147749896
            res = &quot;Неверный параметр&quot;
        Case -2147749894
            res = &quot;Недостаточно памяти&quot;
        Case -2147749909
            res = &quot;Ошибка сети&quot;
        Case -2147217308
            res = &quot;Учетные данные пользователя не могут быть использованы&quot; &amp; _
                    vbCrLf &amp; &quot;для подключения к локальному компьютеру&quot;    
        Case -2147749889
            res = &quot;Ошибка не определена&quot;
        Case Else
            res = &quot;Неизвестная ошибка&quot;
    End Select    
    ConnectionErrors = &quot;Код ошибки: &quot; &amp; zn &amp; vbCrLf &amp; res
End Function

&lt;/script&gt;
&lt;!-- Изменяем размер окна и рисуем нарядную градиентную заливку :) --&gt;        
&lt;body onload=&quot;OnLoad()&quot; 
    STYLE=&quot;filter:progid:DXImageTransform.Microsoft.Gradient (GradientType=1, StartColorStr=&#039;#000000&#039;, EndColorStr=&#039;#0000FF&#039;)&quot;&gt;
    &lt;table align=center&gt;        
        &lt;tr&gt;
            &lt;td&gt;                
                &lt;div id=&quot;strCompList&quot;&gt;&lt;/div&gt;            
            &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;
                &lt;div id=&quot;buttons&quot;&gt;&lt;/div&gt;                
            &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;
                &lt;input type=&quot;button&quot; class=&quot;button&quot; name=&quot;btnCheck&quot; id=&quot;btnCheck&quot; value=&quot;Проверить&quot; onclick=&quot;OnClickBtn True&quot;&gt;            
            &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;
                &lt;input type=&quot;button&quot; class=&quot;button&quot; name=&quot;btnCheck&quot; id=&quot;btnCheck&quot; value=&quot;Блокировать&quot; onclick=&quot;OnClickBtn False&quot;&gt;            
            &lt;/td&gt;
        &lt;/tr&gt;
    &lt;/table&gt;
&lt;/body&gt; 
&lt;/html&gt;</code></pre></div><p>Код VBS:<br /></p><div class="codebox"><pre><code>Option Explicit    

Const strDll = &quot;DADeskTop.dll&quot; &#039;библиотека
Const strOutputFileName = &quot;lm&quot;

&#039;пытаемся зарегистрировать библиотеку
If RegLib(strDll) Then
    Dim objDADeskTop
    &#039;создаем экземпляр класса из либы = strDll
    Set objDADeskTop = CreateObject(&quot;DADeskTop.DAClass&quot;)
    &#039;если нет аргументов - пишем наличие залоченности в файл
    If WScript.Arguments.Count = 0 Then 
        Dim fso
        Dim objOutputFile &#039;файл вывода данных        
        Set fso = CreateObject(&quot;Scripting.FileSystemObject&quot;)
        &#039;создаем файл, если уже существует - перезапишем
        Set objOutputFile = fso.CreateTextFile(strOutputFileName, True)
        &#039;если либа отработала без ошибок - пишем состояние блокировки
        If objDADeskTop.ILErr Then objOutputFile.WriteLine objDADeskTop.ILLocked    
        &#039;закрываем файл
        objOutputFile.Close
        Set objOutputFile = Nothing
        Set fso = Nothing
    Else &#039;блокируем компьютер        
        objDADeskTop.LockWS()
    End If
    Set objDADeskTop = Nothing    
End If

&#039;функция регистрации библиотеки
Function RegLib(strDll)
    Dim wshShell, intRet
    Set wshShell = CreateObject(&quot;WScript.Shell&quot;)    
    intRet = wshShell.Run(&quot;regsvr32.exe /s  &quot; &amp; strDll )
    Set wshShell = Nothing
    If intRet = 0 Then &#039;если удалось зарегистрировать - True
        RegLib = True
    Else
        RegLib = False
    End If    
End Function</code></pre></div><p>По идее все должно работать так:<br />- через FSO в шару ADMIN$ удаленного компа копируются библиотека и скрипт<br />- запускается скрипт через Win32_Process.Create<br />- в случае проверки скрипт создает файл с информацией о состоянии залоченности компа, HTA читает файл через FSO и выдает MsgBox о состоянии<br />- в случае блокировки скрипт запускается с параметром и если процесс запускается без проблем, то скрипт отрабатывает единственный метод библиотеки и блокирует компьютер<br />Надеюсь, что все так и есть <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /><br />Хотелось бы мнение уважаемых специалистов. Check it out <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /></p>]]></description>
			<author><![CDATA[null@example.com (dab00)]]></author>
			<pubDate>Fri, 02 Sep 2011 13:04:35 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=51087#p51087</guid>
		</item>
		<item>
			<title><![CDATA[Re: Vbscript: определение залоченности пользователем системы]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=51008#p51008</link>
			<description><![CDATA[<p>Если еще есть интерес <a href="http://narod.ru/disk/23635137001/IsLocked.ZIP.html">здесь</a> скрипт + библиотека.<br />Исходник либы:<br /></p><div class="codebox"><pre><code>Option Explicit
&#039;API-функции
Private Declare Function OpenDesktop Lib &quot;user32&quot; Alias &quot;OpenDesktopA&quot; _
        (ByVal lpszDesktop As String, ByVal dwFlags As Integer, _
        ByVal fInherit As Boolean, ByVal dwDesiredAccess As Integer) As Integer
Private Declare Function CloseDesktop Lib &quot;user32&quot; (ByVal hDesktop As Integer) As Integer
Private Declare Function SwitchDesktop Lib &quot;user32&quot; (ByVal hDesktop As Integer) As Integer
Private Declare Function LockWorkStation Lib &quot;user32&quot; () As Integer

&#039;наличие ошибок, True - ошибок нет
Public Property Get ILErr() As Boolean
    Dim bRet() As Boolean
    bRet = IsLocked
    ILErr = bRet(0)
End Property

&#039;заблокирован ли компьютер, True - заблокирован
Public Property Get ILLocked() As Boolean
    Dim bRet() As Boolean
    bRet = IsLocked
    ILLocked = bRet(1)
End Property

&#039;функция проверки компьютера на залоченность
&#039;возвращает массив из двух логических значений:
&#039;0: True - ошибок нет, False - ошибка
&#039;1: True - заблокирован, False - нет
Private Function IsLocked() As Boolean()
    Dim lngHwnd As Long &#039;дескриптор рабочего стола
    Dim lngRet As Long &#039;успех активации и завершения работы с рабочим столом
    Dim bRetArr(1) As Boolean
    
    &#039;получаем дескриптор рабочего стола
    lngHwnd = OpenDesktop(&quot;Default&quot;, 0, False, &amp;H100)
    If lngHwnd = 0 Then &#039;не удалось получить дескриптор
        bRetArr(0) = False &#039;ошибка
    Else
        &#039;активируем рабочий стол
        lngRet = SwitchDesktop(lngHwnd)
        If lngRet = 0 Then &#039;если активировать не удалось
            If Err.LastDllError = 0 Then
                bRetArr(0) = True &#039;ошибок нет
                bRetArr(1) = True &#039;заблокирован
            Else
                bRetArr(0) = False &#039;ошибка
            End If
        Else
            bRetArr(0) = True &#039;ошибок нет
            bRetArr(1) = False &#039;не заблокирован
        End If
        lngRet = CloseDesktop(lngHwnd) &#039;завершаем работу с рабочим столом
        &#039;If lngRet = 0 Then IsLocked(1) = False &#039;ошибка
    End If
    IsLocked = bRetArr
End Function

&#039;функция блокировки компьютера
Public Function LockWS() As Integer
    LockWS = LockWorkStation()
End Function</code></pre></div><p>У класса пара свойств: ILErr - наличие ошибок, и ILLocked - наличие блокировки, и один метод - LockWS - собственно блокировка.<br />Код скрипта:<br /></p><div class="codebox"><pre><code>Const strDll = &quot;DADeskTop.dll&quot; &#039;библиотека
Set wshShell = CreateObject(&quot;WScript.Shell&quot;)
&#039;пытаемся зарегистрировать библиотеку
ret = wshShell.Run(&quot;regsvr32.exe /i /s  &quot; &amp; strDll &amp; &quot;,0,True&quot;)
&#039;проверяем успех регистрации
If ret &lt;&gt; 0 Then &#039;если не удалось зарегистрировать
    wshShell.PopUp ,1,&quot;Не удалось зарегистрировать библиотеку &quot; &amp; strDll ,16 
    Set wshShell = Nothing
    WScript.Quit
End If
Set wshShell = Nothing
&#039;создаем экземпляр класса из либы = strDll
Set objDADeskTop = CreateObject(&quot;DADeskTop.DAClass&quot;)        
MsgBox &quot;Отсутствие ошибок: &quot; &amp; objDADeskTop.ILErr &amp; vbCrLf &amp; _
        &quot;Компьютер заблокирован: &quot; &amp; objDADeskTop.ILLocked

&#039;5 секунд на блокировку компа - Win+L :)
WScript.Sleep 5000
MsgBox &quot;Отсутствие ошибок: &quot; &amp; objDADeskTop.ILErr &amp; vbCrLf &amp; _
        &quot;Компьютер заблокирован: &quot; &amp; objDADeskTop.ILLocked
&#039;можно залочить компьютер
objDADeskTop.LockWS()        
Set objDADeskTop = Nothing</code></pre></div><p>Как доставить скрипт с либой на целевой комп, думаю, догадаетесь <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" />.<br />Я бы сделал примерно так: fso.CopyFile &quot;\\Имя_Компа\Admin$\Имя_Файла, наличие админской шары, разумеется, обязательно.<br /><a href="http://blogs.technet.com/b/heyscriptingguy/archive/2004/11/15/can-i-lock-a-workstation-using-a-script.aspx">Здесь</a> неплохая статья.</p>]]></description>
			<author><![CDATA[null@example.com (dab00)]]></author>
			<pubDate>Thu, 01 Sep 2011 04:38:02 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=51008#p51008</guid>
		</item>
		<item>
			<title><![CDATA[Re: Vbscript: определение залоченности пользователем системы]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=50946#p50946</link>
			<description><![CDATA[<div class="quotebox"><cite>alexii пишет:</cite><blockquote><p><strong>Rom5</strong>, я так чую, что без написания какой-либо библиотеки-посредника на ЯВУ тут не обойтись. Сам код под С++, С# мне попадался, когда я искал решение под WSH.</p></blockquote></div><p>Видимо, так и есть...<br />Мониторинг проиходящего при блокировании/разблокировании положительного результата не дал.<br />На самом майкрософте - <a href="http://msdn.microsoft.com/en-us/library/aa383841(v=vs.85).aspx">http://msdn.microsoft.com/en-us/library … s.85).aspx</a><br />нашел Visual Basic 8 declaration Function WTSRegisterSessionNotification Lib &quot;Wtsapi32&quot;, что, увы, не для простого использования в скромном скрипте.<br />&quot;Ну, и ладно! Не сильно и хотелось...&quot; (с)</p>]]></description>
			<author><![CDATA[null@example.com (Rom5)]]></author>
			<pubDate>Mon, 29 Aug 2011 19:27:00 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=50946#p50946</guid>
		</item>
		<item>
			<title><![CDATA[Re: Vbscript: определение залоченности пользователем системы]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=50937#p50937</link>
			<description><![CDATA[<p><strong>Rom5</strong>, я так чую, что без написания какой-либо библиотеки-посредника на ЯВУ тут не обойтись. Сам код под С++, С# мне попадался, когда я искал решение под WSH.</p>]]></description>
			<author><![CDATA[null@example.com (alexii)]]></author>
			<pubDate>Mon, 29 Aug 2011 16:30:56 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=50937#p50937</guid>
		</item>
		<item>
			<title><![CDATA[Re: Vbscript: определение залоченности пользователем системы]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=50933#p50933</link>
			<description><![CDATA[<div class="quotebox"><cite>Rom5 пишет:</cite><blockquote><div class="quotebox"><cite>alexii пишет:</cite><blockquote><p><strong>Rom5</strong>, у меня всё одно один. Откуда такая информация?</p></blockquote></div><p>Все оказалось не так просто... Нужно подумать.</p><p>Изначально я сообщил о двух winlogon, т.к. пару раз в процессах (pslist от Sysinternals) на доменных машинах (XP SP3 eng) наблюдал за этим задвоением, причем во втором случае уже специально наблюдал через Rem.Assistance за экраном залоченной машиной - как только юзер ее разлочил, процесс остался один.</p></blockquote></div><p>Каюсь. Это (2-й winlogon) были последствия запуска на удаленную машину Remote Assistance.<br />Т.е. доменность входа и блокировка здесь не причем - нечистота эксперимента.</p><p>А вопрос о признаке блокировки остается открытым..</p>]]></description>
			<author><![CDATA[null@example.com (Rom5)]]></author>
			<pubDate>Mon, 29 Aug 2011 05:16:15 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=50933#p50933</guid>
		</item>
		<item>
			<title><![CDATA[Re: Vbscript: определение залоченности пользователем системы]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=50906#p50906</link>
			<description><![CDATA[<div class="quotebox"><cite>Rom5 пишет:</cite><blockquote><p>…потестирую процессы скорее всего аж во вторник, т.к. в понедельник будет не до изысканий. Тогда общественности и донесу результат.</p></blockquote></div><p>Спасибо, будем ждать.<br /></p><div class="quotebox"><cite>Rom5 пишет:</cite><blockquote><p>сбило с толку то, что открыте окна &quot;Свойства: Экрана&quot; на вкладке &quot;Заставка&quot; уже вызывает процесс logon.scr )</p></blockquote></div><p>Можно ориентироваться на параметр в .CommandLine при вызове *.scr.</p>]]></description>
			<author><![CDATA[null@example.com (alexii)]]></author>
			<pubDate>Fri, 26 Aug 2011 22:36:41 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=50906#p50906</guid>
		</item>
		<item>
			<title><![CDATA[Re: Vbscript: определение залоченности пользователем системы]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=50903#p50903</link>
			<description><![CDATA[<div class="quotebox"><cite>alexii пишет:</cite><blockquote><p><strong>Rom5</strong>, у меня всё одно один. Откуда такая информация?</p></blockquote></div><p>Все оказалось не так просто... Нужно подумать.</p><p>Изначально я сообщил о двух winlogon, т.к. пару раз в процессах (pslist от Sysinternals) на доменных машинах (XP SP3 eng) наблюдал за этим задвоением, причем во втором случае уже специально наблюдал через Rem.Assistance за экраном залоченной машиной - как только юзер ее разлочил, процесс остался один.<br />Увы, на сегодняшний момент рабочая рутина так и не дала времени помоделировать в домене такую ситуацию специально и понаблюдать вдумчиво, хотя дома даже махонький скрипт подготовил для этого дела.</p><p>На домашней же отдельной машине (XP sp3 rus) я понял, что есть отличия от работы в домене.</p><p>Тест проводил так: скринсейвер изначально настроил на 1 мин, простейший скрипт, выбирающий данные по этим двум процессам, запускаю из батника в бесконечном цикле с паузой приблизительно 30сек, далее блокирую консоль Win+L и гуляю, срабатывает скринсейвер, гуляю немного с ним, потом я его снимаю, еще гуляю с полминуты, разблокируюсь, прерываю батник, смотрю лог.</p><p>Так вот,&nbsp; блокирование консоли на процессы не влияло, а срабатывание скринсейвера вызывало запуск logon.scr и причем родителем процесса выступал winlogon.<br />Тест показал, что logon.scr появляется только при срабатывании хранителя (аналогично доменной ситуации),&nbsp; а winlogon всегда один. </p><p>Т.е. результат кардинально отличается от работы в домене или обособлено, а т.к. работа в домене мне куда важнее - потестирую процессы скорее всего аж во вторник, т.к. в понедельник будет не до изысканий. Тогда общественности и донесу результат.</p><p>батник запуска:<br /></p><div class="codebox"><pre><code>:::: ---- prc_wlog.cmd ----
:Beg
cscript /nologo prc_wlog.vbs &gt;&gt; prc_wlog.txt

ping -n 30 127.0.0.1 &gt;nul

Goto :Beg</code></pre></div><p>скрипт:<br /></p><div class="codebox"><pre><code>&#039;&#039;&#039;&#039;&#039;&#039; ----- prc_wlog.vbs -------
On Error Resume Next
Const wbemFlagReturnImmediately = &amp;h10
Const wbemFlagForwardOnly = &amp;h20

strComputer = &quot;127.0.0.1&quot;

WScript.Echo &quot;==========================================&quot;
WScript.Echo &quot;Computer: &quot; &amp; strComputer
WScript.Echo Now()
WScript.Echo &quot;==========================================&quot;

Set objWMIService = GetObject(&quot;winmgmts:\\&quot; &amp; strComputer &amp; &quot;\root\CIMV2&quot;)
Set colItems = objWMIService.ExecQuery(&quot;SELECT * FROM Win32_Process&quot;, &quot;WQL&quot;, wbemFlagReturnImmediately + wbemFlagForwardOnly)
 
iWinLog = 0 : iScrLog = 0

For Each objItem In colItems
    sName = objItem.Name
    If sName = &quot;winlogon.exe&quot; OR sName = &quot;logon.scr&quot; Then
        If sName = &quot;winlogon.exe&quot; Then iWinLog = iWinLog + 1
        If sName = &quot;logon.scr&quot; Then iScrLog = iScrLog + 1
        WScript.Echo &quot;Name: &quot; &amp; sName
        WScript.Echo &quot;CreationDate: &quot; &amp; WMIDateStringToDate(objItem.CreationDate)
        WScript.Echo &quot;ParentProcessId: &quot; &amp; objItem.ParentProcessId
        WScript.Echo &quot;Priority: &quot; &amp; objItem.Priority
        WScript.Echo &quot;ProcessId: &quot; &amp; objItem.ProcessId
        WScript.Echo
    End If &#039;objItem.Caption = &quot;winlogon.exe&quot; Then
Next
WScript.Echo &quot;==========================================&quot;
WScript.Echo &quot;iWinLog = &quot; &amp; CStr(iWinLog) &amp; &quot;  iScrLog =&quot; &amp; CStr(iScrLog)
WScript.Echo
WScript.Echo

Function WMIDateStringToDate(dtmDate)
WScript.Echo dtm: 
    WMIDateStringToDate = CDate(Mid(dtmDate, 5, 2) &amp; &quot;/&quot; &amp; _
    Mid(dtmDate, 7, 2) &amp; &quot;/&quot; &amp; Left(dtmDate, 4) _
    &amp; &quot; &quot; &amp; Mid (dtmDate, 9, 2) &amp; &quot;:&quot; &amp; Mid(dtmDate, 11, 2) &amp; &quot;:&quot; &amp; Mid(dtmDate,13, 2))
End Function</code></pre></div><p>лог<br /></p><div class="codebox"><pre><code>==========================================
Computer: 127.0.0.1
26.08.2011 23:06:37
==========================================
Name: winlogon.exe

CreationDate: 26.08.2011 23:03:13
ParentProcessId: 604
Priority: 13
ProcessId: 680

==========================================
iWinLog = 1  iScrLog =0


==========================================
Computer: 127.0.0.1
26.08.2011 23:07:06
==========================================
Name: winlogon.exe

CreationDate: 26.08.2011 23:03:13
ParentProcessId: 604
Priority: 13
ProcessId: 680

==========================================
iWinLog = 1  iScrLog =0


==========================================
Computer: 127.0.0.1
26.08.2011 23:07:36
==========================================
Name: winlogon.exe

CreationDate: 26.08.2011 23:03:13
ParentProcessId: 604
Priority: 13
ProcessId: 680

==========================================
iWinLog = 1  iScrLog =0


==========================================
Computer: 127.0.0.1
26.08.2011 23:08:06
==========================================
Name: winlogon.exe

CreationDate: 26.08.2011 23:03:13
ParentProcessId: 604
Priority: 13
ProcessId: 680

Name: logon.scr

CreationDate: 26.08.2011 23:07:59
ParentProcessId: 680
Priority: 4
ProcessId: 1808

==========================================
iWinLog = 1  iScrLog =1


==========================================
Computer: 127.0.0.1
26.08.2011 23:08:35
==========================================
Name: winlogon.exe

CreationDate: 26.08.2011 23:03:13
ParentProcessId: 604
Priority: 13
ProcessId: 680

Name: logon.scr

CreationDate: 26.08.2011 23:07:59
ParentProcessId: 680
Priority: 4
ProcessId: 1808

==========================================
iWinLog = 1  iScrLog =1


==========================================
Computer: 127.0.0.1
26.08.2011 23:09:05
==========================================
Name: winlogon.exe

CreationDate: 26.08.2011 23:03:13
ParentProcessId: 604
Priority: 13
ProcessId: 680

==========================================
iWinLog = 1  iScrLog =0


==========================================
Computer: 127.0.0.1
26.08.2011 23:09:34
==========================================
Name: winlogon.exe

CreationDate: 26.08.2011 23:03:13
ParentProcessId: 604
Priority: 13
ProcessId: 680

==========================================
iWinLog = 1  iScrLog =0</code></pre></div><p>Сорри, за много текста среди ночи)</p><p>ps. Причина правки: сбило с толку то, что открыте окна &quot;Свойства: Экрана&quot; на вкладке &quot;Заставка&quot; уже вызывает процесс logon.scr )</p>]]></description>
			<author><![CDATA[null@example.com (Rom5)]]></author>
			<pubDate>Fri, 26 Aug 2011 21:16:55 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=50903#p50903</guid>
		</item>
		<item>
			<title><![CDATA[Re: Vbscript: определение залоченности пользователем системы]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=50876#p50876</link>
			<description><![CDATA[<div class="quotebox"><cite>Rom5 пишет:</cite><blockquote><p>... признаком залоченности является наличие 2-х (!) процессов &quot;winlogon&quot;...</p></blockquote></div><p>У меня хоть под XP, хоть под 7 - по одному в любом случае.</p>]]></description>
			<author><![CDATA[null@example.com (Dmitrii)]]></author>
			<pubDate>Fri, 26 Aug 2011 04:19:58 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=50876#p50876</guid>
		</item>
		<item>
			<title><![CDATA[Re: Vbscript: определение залоченности пользователем системы]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=50873#p50873</link>
			<description><![CDATA[<p><strong>Rom5</strong>, у меня всё одно один. Откуда такая информация?</p>]]></description>
			<author><![CDATA[null@example.com (alexii)]]></author>
			<pubDate>Thu, 25 Aug 2011 19:58:31 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=50873#p50873</guid>
		</item>
		<item>
			<title><![CDATA[Re: Vbscript: определение залоченности пользователем системы]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=50871#p50871</link>
			<description><![CDATA[<p>Ребята, может кому пригодится - признаком залоченности является наличие 2-х (!) процессов &quot;winlogon&quot;.<br />Т.е. для ожидания &quot;подхода&quot; юзера и разблокировки своей машины буду мониторить количество этих процессов и все)</p>]]></description>
			<author><![CDATA[null@example.com (Rom5)]]></author>
			<pubDate>Thu, 25 Aug 2011 15:30:25 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=50871#p50871</guid>
		</item>
		<item>
			<title><![CDATA[Vbscript: определение залоченности пользователем системы]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=50822#p50822</link>
			<description><![CDATA[<p>Коллеги, подскажите возможный способ определения заблокированности консоли удаленной машины (Win+L, например).<br />Работу скринсейвера-то можно отследить наличием процесса с &quot;.scr&quot;, но далеко не всегда на залоченной станции работает хранитель экрана.</p>]]></description>
			<author><![CDATA[null@example.com (Rom5)]]></author>
			<pubDate>Tue, 23 Aug 2011 10:02:08 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=50822#p50822</guid>
		</item>
	</channel>
</rss>
