AXVill

Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Я сделал немного извращенный метод, но мне он очень нравится - 100% работает и 100% односторонний =) Все построено на паре скриптов и софтине psexec. Скрипт вынимает сообщение из "message.txt", создает массив из имен компьютеров, записанных в "comps.txt", на основании пинга определяет включенные, копирует на них VBS-скрипт с сообщением, выполняет скрипт (у всех появляется MsgBox, с единственной кнопкой OK) и затем удаляет скрипт с клиентских компов. Скрипт для примера: В примере много чего не доделано - нет проверок на ошибки, не скрыто окно консоли на клиенте, я бы добавил вынимание компов из Active Directory, но это уже тема другого топика. Код: Dim MText, MStream, Message, CompList, CompStream, temp, CompArr, CodeStream Set FSO = CreateObject("Scripting.FileSystemObject") ErrorVar = 0 If Not FSO.FileExists("message.txt") Then ErrorVar = 1 If Not FSO.FileExists("comps.txt") Then ErrorVar = 2 Select Case ErrorVar Case 0 WScript.Sleep(1000) Case 1 MsgBox "Не найден файл message.txt" WScript.Quit Case 2 MsgBox "Не найден файл comps.txt" WScript.Quit End Select Set MText = FSO.GetFile("message.txt") Set MStream = MText.OpenAsTextStream(1) Set CompList = FSO.GetFile("comps.txt") Set CompStream = CompList.OpenAsTextStream(1) Set CodeStream = FSO.CreateTextFile("message.vbs", true) Message = Chr(34) & MStream.ReadLine() & Chr(34) & " & vbCrLf " & " _ " & vbCrLf While Not MStream.AtEndOfStream Message = Message & "& " & Chr(34) & MStream.ReadLine() & Chr(34) & " & vbCrLf" & " _ " & vbCrLf Wend i = 0 While Not CompStream.AtEndOfStream temp = CompStream.ReadLine() i = CInt(i) + 1 Wend CompStream.Close ReDim CompArr(i) i = 0 Set CompStream = CompList.OpenAsTextStream(1) While Not CompStream.AtEndOfStream CompArr(CInt(i)) = CompStream.ReadLine() i = CInt(i) + 1 Wend CompStream.Close CodeStream.WriteLine("MsgBox " & Message) For Each present In CompArr If DeadOrAlive(present) = TRUE Then FSO.CopyFile "message.vbs", "\\" & present & "\c$\", true End If Next strCmdline = "psexec @comps.txt -i -d -n 5 " & Chr(34) & "cscript.exe" & Chr(34) & " c:\message.vbs /nologo" CreateObject("Wscript.Shell").Run strCmdLine, 0, True For Each present In CompArr If DeadOrAlive(present) = TRUE Then FSO.DeleteFile("\\" & present & "\c$\message.vbs") End If Next function DeadOrAlive(ByVal strHost) Const SYSTEM_FOLDER = 1, TEMP_FOLDER = 2 Set FSO = CreateObject("Scripting.FileSystemObject") With FSO Do strTempFile = .BuildPath(.GetSpecialFolder(TEMP_FOLDER), .GetTempName) Loop While .FileExists(strTempFile) strCmdLine = .BuildPath(.GetSpecialFolder(SYSTEM_FOLDER), "cmd.exe") _ & " /c " & .BuildPath(.GetSpecialFolder(SYSTEM_FOLDER), "ping.exe") _ & " -n 1 " & strHost & " > " & strTempFile End With CreateObject("Wscript.Shell").Run strCmdLine, 0, True Set objRE = CreateObject("VBScript.RegExp") objRE.Pattern = " [0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}: [\s\S]*TTL=" Set objTS = FSO.OpenTextFile(strTempFile, 1) DeadOrAlive = objRE.Test(objTS.ReadAll) objTS.Close FSO.DeleteFile strTempFile End Function |
| Всего записей: 219 | Зарегистр. 22-09-2005 | Отправлено: 13:43 03-03-2009 | Исправлено: AXVill, 13:51 03-03-2009 |
|