Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Опрос компьютеров в сети на наличие каталога (http://forum.oszone.net/showthread.php?t=275809)

Lezenford 15-01-2014 10:27 2289484

Опрос компьютеров в сети на наличие каталога
 
Всем добрый день!

Столкнулся с проблемой. Есть доменная сеть на более чем 1к машин. Нужно создать лог файл, в котором будет отображаться есть или нет на каждой из машин определенный каталог.
Список машин можно будет подгрузить из отдельного файла - это не проблема. Запускаться этот скрипт будет от имели учетки, имеющей админиские права на этих машинах.
Вопрос, как это сделать? Лучше средствами .bat, но если не получится - открыт для предложений...

Iska 15-01-2014 14:09 2289628

Код:

@echo off
setlocal enableextensions enabledelayedexpansion

>"Out.txt" 2>nul wmic.exe /node:@NodeList.txt FSDir where "Name='c:\\Temp'" get CSName, Name

endlocal
exit /b 0

В «Out.txt» будут помещены все наличествующие каталоги «c:\Temp» на машинах, перечисленных в «NodeList.txt».

Lezenford 15-01-2014 14:20 2289637

Отлично! Спасибо большое! То, что нужно!

А можно добавить сюда еще обработчик, что если каталог не найден, то он так и писал бы в логе-файле, что каталога нет?
Меня при этом опросе больше волнуют машины, где каталог отсутствует.

Iska 15-01-2014 14:23 2289640

Lezenford, сомневаюсь.

Lezenford 15-01-2014 14:30 2289644

Ладно, спасибо, это все лучше чем ручной перебор. Еще раз спасибо!

Iska 15-01-2014 16:50 2289727

На WSH:
читать дальше »
Код:

Option Explicit

Dim strFolder
Dim strNodeList

Dim strComputer
Dim objSWbemLocator


strFolder  = "c:\Temp"
strNodeList = "E:\Песочница\0351\NodeList.txt"

With WScript.CreateObject("Scripting.FileSystemObject")
        If .FileExists(strNodeList) Then
               
                Set objSWbemLocator = WScript.CreateObject("WbemScripting.SWbemLocator")
               
                With .OpenTextFile(strNodeList)
                        Do Until .AtEndOfStream
                                strComputer = Trim(.ReadLine())
                               
                                If IsConnected(strComputer) Then
                                        With objSWbemLocator.ConnectServer(strComputer, "root\cimv2")
                                                If .ExecQuery("SELECT Name FROM Win32_Directory WHERE Name='" & Replace(strFolder, "\", "\\") & "'").Count = 0 Then
                                                        WScript.Echo strComputer
                                                End If
                                        End With
                                Else
                                        WScript.Echo strComputer & " is not found."
                                End If
                        Loop
                       
                        .Close
                End With
               
                Set objSWbemLocator = Nothing
        Else
                WScript.Echo "Node list file [" & strNodeList & "] not found."
                WScript.Quit 1
        End If
End With

WScript.Quit 0
'=============================================================================

'=============================================================================
Function IsConnected(strAddress)
        Dim objSWbemObjectEx
       
        IsConnected = False
       
        For Each objSWbemObjectEx In GetObject( _
                "winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2").ExecQuery( _
                        "SELECT * FROM Win32_PingStatus WHERE Address = '" & strAddress & "'" _
                )
               
                With objSWbemObjectEx
                        If Not IsNull(.StatusCode) And .StatusCode = 0 Then
                                IsConnected = True
                        End If
                End With
               
                Exit For
        Next
       
        Set objSWbemObjectEx = Nothing
End Function
'=============================================================================


Если имена недоступных машин Вас не интересуют — закомментируйте выделенное.

Lezenford 16-01-2014 14:38 2290227

Iska, спасибо, но я не знаю JS и потому, к сожалению, не могу понять на что у меня ругается компилятор. При попытки скомпилить код выдается ошибка:

---------------------------
Windows Script Host
---------------------------
Сценарий: D:\скрипт.js
Строка: 1
Символ: 8
Ошибка: Предполагается наличие ';'
Код: 800A03EC
Источник: Ошибка компиляции Microsoft JScript

---------------------------
ОК
---------------------------

В коде поменял только путь до NodeList.
Откуда он берет ошибку про ";" не понимаю - этот символ не закрывает здесь строки как в C# например.

Iska 16-01-2014 15:03 2290251

Это не JScript, а VBScript, посему сохраняйте код в файле с расширением не «.js», а «.vbs».

Цитата:

Цитата Lezenford
Откуда он берет ошибку про ";" не понимаю - этот символ не закрывает здесь строки как в C# например. »

В JScript так и есть — закрывает оператор.

Поскольку у Вас было использовано расширение «.js», Windows Script Host использует ядро JScript для обработки, которое, в свою очередь, пытается интерпретировать строку, не видит там символа «;» и сообщает об указанной ошибке.

Lezenford 16-01-2014 15:28 2290271

Iska, да, все заработало. Прошу прощения за глупые вопросы :)
Но после запуска выяснился еще 1 нюанс - у него выдано выводить echo с результатом если не найден каталог или сама машина. А можно вместо echo организовать запись лог-файла? Все таки в домене очень много машин и не все они в момент проверки будут в сети.

Iska 16-01-2014 15:45 2290277

Цитата:

Цитата Lezenford
А можно вместо echo организовать запись лог-файла? »

Код:

cscript.exe //nologo "Путь\Скрипт.vbs" >"Путь\Имя.log"

Lezenford 16-01-2014 15:57 2290286

Отлично! То что нужно! Спасибо огромное. Нужно как-нибудь сесть за скриптовые языки... а то как калека...


Время: 13:10.

Время: 13:10.
© OSzone.net 2001-