0 / 0 / 0
Регистрация: 17.03.2013
Сообщений: 20
1

Нужен скрипт для инвентаризации принтерных очередей

10.06.2013, 12:26. Показов 2228. Ответов 19
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Уважаемые форумчане, мне очень нужен скрипт, который поможем мне привести в порядок принтерный парк
в нашей организации огромное кол-во принтеров более 1000 , а так же 2 десятка принт серверов, к сожалению нет точной информации на каком из принт серваках какие принтера, и посему нужен скрипт который будет делать следующее:

1. Скрипт должен пройти по всему домену и найти серваки у которых есть роль file print server
2. залезть на эти серваки и собрать инфу обо всех принт очередях которые на них есть ((Queue Name|Shared Name|Comment|Location|PortName|Queued|Shared|Published|Status|Error и т.д.
3. проверить доступен ли принтер - банальный пинг
4. проверить установлен ли на принтерной очереди опция - двухсторонняя печать
5. проверить на наличие валидного логина пароля от принтера (к примеру login user1234 pass 4321)
6. а так же проверить в АД наличие дублирующихся записей по выше найдем принт очередям

всю полученную инфу свести в экселевский файлик
примерно так должны будут выглядить наименования полей:
Printserver (FQDN) | Print Name |Shared Name|Comment|Location|PortName|Queued|Shared|Published|Status (ping yes or no)|Duble in Domain(yes or no) | Valid login (Valid or Invalid) | Print on both sides (yes/no)

Скрипт очень сложный и у меня к сожалению нет возможности такой написать)
Надеюсь на вашу помощь , заранее спасибо!
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.06.2013, 12:26
Ответы с готовыми решениями:

Скрипт для инвентаризации компьютеров
Добрый день, уважаемые форумчане! Есть скрип производящий инвентаризацию ПК по сети. (во...

Библиотеки для работы с IBM MQ для создания каналов/очередей/администраторов очередей
Есть ли какие-нибудь библиотеки для работы с IBM MQ для создания каналов/очередей/администраторов...

Изменить скрипт инвентаризации компьютеров в сети
Доброго времени суток, уважаемые форумчане! Есть скрипт для инвентаризации компов в сети: If...

Перевести скрипт инвентаризации компьютеров из VBScript в VB.NET
Есть скрипт инвентаризации компьютеров в сети: If WScript.Arguments.Count = 1 Then strComputer...

19
2619 / 549 / 109
Регистрация: 21.03.2012
Сообщений: 1,051
10.06.2013, 12:57 2
1. Все ли принтеры имеют свой IP?
2. Все ли принтеры опубликованы в AD?
3. Какие версии ОС на серверах печати?
4. В чём должна заключаться проверка на "на наличие валидного логина пароля от принтера"?
5. Каков критерий определения "дублирующихся записей"?
0
0 / 0 / 0
Регистрация: 17.03.2013
Сообщений: 20
10.06.2013, 13:35  [ТС] 3
Цитата Сообщение от Dmitrii Посмотреть сообщение
1. Все ли принтеры имеют свой IP?
2. Все ли принтеры опубликованы в AD?
3. Какие версии ОС на серверах печати?
4. В чём должна заключаться проверка на "на наличие валидного логина пароля от принтера"?
5. Каков критерий определения "дублирующихся записей"?
1. все принтеры сетевые, единственный момент часть имею собственный ip, часть получают ip по dhcp
2. все
3. 2003/2008 r2
4. зайти по телнету с определнным логином паролем, если не пускает, то писать в итоговую табличку invalid или если пустил то valid
5. например принтер имеет имя pr0001, а в АД есть 2 принтера с подобным именем pr0001 и pr0001-1
вот вылавливать такого рода двойные записи
0
2619 / 549 / 109
Регистрация: 21.03.2012
Сообщений: 1,051
10.06.2013, 14:29 4
В качестве заготовки могу предложить нижеприведённый сценарий на VBS (в Вашем случае его лучше использовать в консольном режиме). Самостоятельно сможете "довести до ума"?
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
Dim objRoot, objConnection, objCommand, objRSet
Dim intNumRecords, strDomain, strLog, arrTemp, strLine, strTemp
Dim objFS, objFile, objWShell
Dim strTranslator, blnIsConsole
 
Set objFS = CreateObject("Scripting.FileSystemObject")
strTranslator = objFS.GetBaseName(WScript.FullName)
If StrComp(strTranslator, "cscript", vbTextCompare) = 0 Then
    blnIsConsole = True
Else
    blnIsConsole = False
End If
strLog = objFS.GetBaseName(WScript.ScriptName) & ".log"
Set objRoot = GetObject("LDAP://RootDSE")
strDomain = objRoot.Get("DefaultNamingContext")
Set objRoot = Nothing
Set objConnection = CreateObject("ADODB.Connection")
objConnection.Provider = "ADsDSOObject"
objConnection.Open "Active Directory Provider"
Set objCommand = CreateObject("ADODB.Command")
Set objCommand.ActiveConnection = objConnection
strAttributes = "printerName,uNCName,portName,driverName,serverName,shortServerName,Location"
objCommand.CommandText = "<LDAP://" & strDomain & ">;(objectCategory=printQueue);" & strAttributes & ";Subtree"
objCommand.Properties("Page Size") = 1000
objCommand.Properties("Timeout") = 30
On Error Resume Next
Set objRSet = objCommand.Execute
If Err.Number = 0 Then
    intNumRecords = objRSet.RecordCount
    If intNumRecords > 0 Then
        strLog = objFS.BuildPath(objFS.GetParentFolderName(WScript.ScriptFullName), strLog)
        Set objFile = objFS.CreateTextFile(strLog, True)
        If Err.Number = 0 Then
            strLine = "Обнаружено записей: " & intNumRecords & vbNewLine & "==="
            objFile.WriteLine strLine
            If blnIsConsole Then WScript.Echo strLine
            objRSet.MoveFirst
            Do Until objRSet.EOF
                For i = 0 To objRSet.Fields.Count - 1
                    strTemp = vbNullString
                    If IsArray(objRSet.Fields(i)) Then
                        arrTemp = objRSet.Fields(i)
                        For j = 0 To UBound(arrTemp)
                            strTemp = strTemp & arrTemp(j) & ";"
                            If Err.Number <> 0 Then Err.Clear
                        Next
                        Erase arrTemp
                    Else
                        strTemp = objRSet.Fields(i).Value
                        If Err.Number <> 0 Then Err.Clear
                    End If
                    strLine = objRSet.Fields(i).Name & " = " & strTemp
                    objFile.WriteLine strLine
                    If blnIsConsole Then WScript.Echo strLine
                Next
                objFile.WriteLine "---"
                If blnIsConsole Then WScript.Echo "---"
                objRSet.MoveNext
            Loop
            objFile.Close
            Set objFile = Nothing
            If blnIsConsole Then
                WScript.Echo "Путь к файлу отчёта: " & UCase(strLog)
            Else
                Set objWShell = CreateObject("WScript.Shell")
                objWShell.Run "notepad.exe " & strLog, 1
                Set objWShell = Nothing
            End If
        Else
            WScript.Echo "Ошибка создания файла отчёта: " & Err.Number & vbNewLine & Err.Description
            Err.Clear
        End If
    Else
        WScript.Echo "Ничего не обнаружено."
    End If
Else
    WScript.Echo "Ошибка выполения запроса: " & Err.Number & vbNewLine & Err.Description
    Err.Clear
End If
Set objRSet = Nothing
On Error GoTo 0
Set objCommand = Nothing
objConnection.Close
Set objConnection = Nothing
Set objFS = Nothing
WScript.Quit 0
0
0 / 0 / 0
Регистрация: 17.03.2013
Сообщений: 20
10.06.2013, 16:59  [ТС] 5
а конкретно каких кусков тут нет?, просто я не шибко то силен в написании скриптов , особенно столько масштабных.. если подскажите что и где, то я бы попробовал, но все таки хотелось бы уже готовый сценарий получить, с минимум переделок.
0
2619 / 549 / 109
Регистрация: 21.03.2012
Сообщений: 1,051
11.06.2013, 11:44 6
Цитата Сообщение от Abbadonus Посмотреть сообщение
... каких кусков тут нет?..
Проще сказать, что есть: опрос AD на наличие опубликованных принтеров и чтение некоторых атрибутов соответствующих объектов. Впрочем, раз все принтеры опубликованы в AD, то отдельный поиск серверов печати представляется излишним.

Цитата Сообщение от Abbadonus Посмотреть сообщение
... хотелось бы уже готовый сценарий получить...
Понятно.
Обещать ничего не могу, но при наличии свободного времени добавлю какие-либо функции (для начала, скажем, удаление дубликатов).

Уточнения:
1) есть ли какой-либо однозначный признак дубликата (например, символ "-" в имени, длина имени и т.п.)?
2) имеются ли для всех сетевых принтеров соответствующие записи в таблице DNS-сервера?
0
0 / 0 / 0
Регистрация: 17.03.2013
Сообщений: 20
11.06.2013, 13:44  [ТС] 7
Цитата Сообщение от Dmitrii Посмотреть сообщение
Проще сказать, что есть: опрос AD на наличие опубликованных принтеров и чтение некоторых атрибутов соответствующих объектов. Впрочем, раз все принтеры опубликованы в AD, то отдельный поиск серверов печати представляется излишним.

Понятно.
Обещать ничего не могу, но при наличии свободного времени добавлю какие-либо функции (для начала, скажем, удаление дубликатов).

Уточнения:
1) есть ли какой-либо однозначный признак дубликата (например, символ "-" в имени, длина имени и т.п.)?
2) имеются ли для всех сетевых принтеров соответствующие записи в таблице DNS-сервера?
Понимаете, мне как раз не в АД нужно искать принтерные очереди, а именно через принтерные сервера, так как, точного списка таких серверов нету, этим способ как бы убивается и задача по поиску этих серверов.
Далее удалять двойные записи не нужно, только информация есть ли они или нет, как правило признак дубликата либо тире либо нижнее подчеркивание.
Да я думаю есть, точнее сказать не могу.
0
2619 / 549 / 109
Регистрация: 21.03.2012
Сообщений: 1,051
11.06.2013, 14:07 8
Цитата Сообщение от Abbadonus Посмотреть сообщение
... этим способ как бы убивается и задача по поиску этих серверов...
Эта задача решается попутно с задачей поиска опубликованных принтеров.

Цитата Сообщение от Abbadonus Посмотреть сообщение
... удалять двойные записи не нужно...
Понятно.
0
0 / 0 / 0
Регистрация: 17.03.2013
Сообщений: 20
11.06.2013, 14:11  [ТС] 9
Цитата Сообщение от Dmitrii Посмотреть сообщение
Эта задача решается попутно с задачей поиска опубликованных принтеров.

Понятно.
Можете сказать ориентировочно, как быстро сможете скрипт этот сделать?)
если сделаете в течении недели это было бы просто суппер!!!
0
2619 / 549 / 109
Регистрация: 21.03.2012
Сообщений: 1,051
12.06.2013, 08:53 10
Цитата Сообщение от Abbadonus Посмотреть сообщение
... если сделаете в течении недели...
Нет. Сейчас много работы.
0
0 / 0 / 0
Регистрация: 17.03.2013
Сообщений: 20
12.06.2013, 23:55  [ТС] 11
а когда сможете?
0
2619 / 549 / 109
Регистрация: 21.03.2012
Сообщений: 1,051
13.06.2013, 12:05 12
Если Вы ограничены какими-либо сроками, то лучше обращайтесь к "фрилансерам". Я ничего обещать не могу.
0
0 / 0 / 0
Регистрация: 17.03.2013
Сообщений: 20
13.06.2013, 12:07  [ТС] 13
Цитата Сообщение от Dmitrii Посмотреть сообщение
Если Вы ограничены какими-либо сроками, то лучше обращайтесь к "фрилансерам". Я ничего обещать не могу.
нет вовремени ограничения нет)
0
2619 / 549 / 109
Регистрация: 21.03.2012
Сообщений: 1,051
18.06.2013, 10:35 14
Вот пробная версия для проверки на принципиальную работоспособность.
Сценарий составляет список опубликованных в AD принтеров с раскладкой по серверам печати, указанием для принтера: имени порта подключения, IP-адреса (если есть), места физического расположения (если задано).
Результаты сохраняются в файл формата .CSV.
Сценарий лучше запускать в консольном режиме, т.к. в этом случае можно будет наблюдать вывод промежуточных результатов работы.
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
Dim objRoot, objConnection, objCommand, objRSet
Dim intNumRecords, strDomain, strLog, strPrinter, strTemp
Dim objFS, objFile, objWShell, arrCaption
Dim strTranslator, blnIsConsole
Dim objDict1, objDict2, objDict3, arrTemp1, arrTemp2
Dim objWMI, objCollection, objItem
 
Set objFS = CreateObject("Scripting.FileSystemObject")
strTranslator = objFS.GetBaseName(WScript.FullName)
If StrComp(strTranslator, "cscript", vbTextCompare) = 0 Then
    blnIsConsole = True
Else
    blnIsConsole = False
End If
strLog = objFS.GetBaseName(WScript.ScriptName) & ".csv"
arrCaption = Array("Сервер печати", "Принтер", "Порт принтера", "IP-адрес принтера", "Расположение принтера")
Set objRoot = GetObject("LDAP://RootDSE")
strDomain = objRoot.Get("DefaultNamingContext")
Set objRoot = Nothing
Set objConnection = CreateObject("ADODB.Connection")
objConnection.Provider = "ADsDSOObject"
objConnection.Open "Active Directory Provider"
Set objCommand = CreateObject("ADODB.Command")
Set objCommand.ActiveConnection = objConnection
strAttributes = "printerName,portName,shortServerName,Location"
objCommand.CommandText = "<LDAP://" & strDomain & ">;(objectCategory=printQueue);" & strAttributes & ";Subtree"
objCommand.Properties("Page Size") = 1000
objCommand.Properties("Timeout") = 30
objCommand.Properties("Sort On") = "shortServerName"
On Error Resume Next
Set objRSet = objCommand.Execute
If Err.Number = 0 Then
    intNumRecords = objRSet.RecordCount
    If intNumRecords > 0 Then
        Set objDict1 = CreateObject("Scripting.Dictionary"): objDict1.CompareMode = 1
        Set objDict2 = CreateObject("Scripting.Dictionary"): objDict2.CompareMode = 1
        Set objDict3 = CreateObject("Scripting.Dictionary"): objDict3.CompareMode = 1
        strLog = objFS.BuildPath(objFS.GetParentFolderName(WScript.ScriptFullName), strLog)
        Set objFile = objFS.CreateTextFile(strLog, True)
        If Err.Number = 0 Then
            For i = 0 To UBound(arrCaption) - 1
                objFile.Write arrCaption(i) & ";"
            Next
            objFile.WriteLine arrCaption(i)
            If blnIsConsole Then WScript.Echo "Обнаружено записей: " & intNumRecords & vbNewLine & "======"
            objRSet.MoveFirst
            Do Until objRSet.EOF
                strTemp = objRSet.Fields("shortServerName").Value
                strPrinter = objRSet.Fields("printerName").Value
                If objDict1.Exists(strTemp) Then
                    objDict1.Item(strTemp) = objDict1.Item(strTemp) & ";" & strPrinter
                    arrTemp1 = objRSet.Fields("portName")
                    objDict2.Item(strTemp) = objDict2.Item(strTemp) & ";" & arrTemp1(0)
                Else
                    objDict1.Add strTemp, strPrinter
                    arrTemp1 = objRSet.Fields("portName")
                    objDict2.Add strTemp, arrTemp1(0)
                End If
                If Not objDict3.Exists(strPrinter) Then objDict3.Add strPrinter, objRSet.Fields("Location").Value
                If blnIsConsole Then WScript.Echo strTemp & " : " & objDict1.Item(strTemp) & " -> " & objDict2.Item(strTemp)
                objRSet.MoveNext
            Loop
            If blnIsConsole Then WScript.Echo "======" & vbNewLine & "Опрос среверов печати" & vbNewLine & "======"
            For Each strTemp In objDict1.Keys
                arrTemp1 = Split(objDict1.Item(strTemp), ";")
                arrTemp2 = Split(objDict2.Item(strTemp), ";")
                If Available(strTemp, blnIsConsole) Then
                    If blnIsConsole Then WScript.Echo strTemp & " -> опрошен"
                    Set objWMI = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strTemp & "\root\CIMV2")
                    For i = 0 To UBound(arrTemp2)
                        Set objCollection = objWMI.ExecQuery("SELECT HostAddress FROM Win32_TCPIPPrinterPort WHERE Name='" & arrTemp2(i) & "'")
                        If objCollection.Count > 0 Then
                            For Each objItem In objCollection
                                objFile.WriteLine strTemp & ";" & arrTemp1(i) & ";" & arrTemp2(i) & ";" & objItem.HostAddress & ";" & objDict3.Item(arrTemp1(i))
                                If Err.Number <> 0 Then Err.Clear
                            Next
                        Else
                            objFile.WriteLine strTemp & ";" & arrTemp1(i) & ";" & arrTemp2(i) & ";Не имеет IP-адреса" & ";" & objDict3.Item(arrTemp1(i))
                        End If
                    Next
                Else
                    If blnIsConsole Then WScript.Echo strTemp & " -> не отвечает"
                    For i = 0 To UBound(arrTemp1)
                        objFile.WriteLine strTemp & ";" & arrTemp1(i) & ";" & arrTemp2(i) & ";Сервер печати не отвечает" & ";" & objDict3.Item(arrTemp1(i))
                    Next
                End If
            Next
            objFile.Close
            Set objFile = Nothing
            If blnIsConsole Then
                WScript.Echo "======" & vbNewLine & "Путь к файлу отчёта: " & UCase(strLog)
            Else
                Set objWShell = CreateObject("WScript.Shell")
                objWShell.Run "notepad.exe " & strLog, 1
                Set objWShell = Nothing
            End If
        Else
            WScript.Echo "Ошибка создания файла отчёта: " & Err.Number & vbNewLine & Err.Description
            Err.Clear
        End If
    Else
        WScript.Echo "Ничего не обнаружено."
    End If
Else
    WScript.Echo "Ошибка выполения запроса: " & Err.Number & vbNewLine & Err.Description
    Err.Clear
End If
Set objRSet = Nothing
On Error GoTo 0
Set objCommand = Nothing
objConnection.Close
Set objConnection = Nothing
Set objFS = Nothing
WScript.Quit 0
 
'======
 
Function Available(strName, blnIsCon)
If blnIsCon Then
    Dim objExec, objOutStream, strTemp
    Set objExec = CreateObject("WScript.Shell").Exec("ping -n 1 -w 130 " & strName)
    Set objOutStream = objExec.StdOut
    While Not objOutStream.AtEndOfStream
        strTemp = strTemp & Trim(objOutStream.ReadLine())
    Wend
    Set objOutStream = Nothing
    Set objExec = Nothing
    If InStr(1, strTemp, "TTL", vbTextCompare) > 0 Then
        Available = True
    Else
        Available = False
    End If
Else
    Dim objWMI, objItem
    On Error Resume Next
    Set objWMI = GetObject("winmgmts:{impersonationLevel=impersonate}").ExecQuery("SELECT StatusCode FROM Win32_PingStatus WHERE Address='" & strName & "'")
    If Err.Number = 0 Then
        For Each objItem In objWMI
            If IsNull(objItem.StatusCode) Then
                Available = False
            Else
                Available = (objItem.StatusCode = 0)
            End If
        Next
    Else
        Err.Clear
        Available = False
    End If
    Set objItem = Nothing
    Set objWMI = Nothing
    On Error GoTo 0
End If
End Function
0
0 / 0 / 0
Регистрация: 17.03.2013
Сообщений: 20
18.06.2013, 14:01  [ТС] 15
все работает отлично!!!
0
2619 / 549 / 109
Регистрация: 21.03.2012
Сообщений: 1,051
18.06.2013, 16:37 16
Хорошо. Попробую завтра продолжить.
0
2619 / 549 / 109
Регистрация: 21.03.2012
Сообщений: 1,051
20.06.2013, 16:05 17
Лучший ответ Сообщение было отмечено как решение

Решение

Вот очередная версия. В ней добавлено чтение ещё нескольких свойств принтера, проверка на доступность принтера "пингованием" и проверка на дубликаты (в самом простом виде - по наличию в имени символов-"индикаторов").
С проверкой валидности имени и пароля к принтеру, пожалуй, будут трудности, т.к. здесь ещё требуется знать порт для подключения (например, наш аппарат по "умолчальному" для TELNET 23 порту отзываться не желает).
Если проверка на дубликаты даёт неверные результаты, то придётся её усложнить (например, задействовав для анализа имён регулярные выражения).
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
Dim objRoot, objConnection, objCommand, objRSet
Dim intNumRecords, strDomain, strLog, strPrinter, strTemp
Dim objFS, objFile, objWShell, arrCaption, strLine
Dim strTranslator, blnIsConsole
Dim objDict1, objDict2, objDict3, arrTemp1, arrTemp2
Dim objWMI, objCollection, objItem, strIP
 
Set objFS = CreateObject("Scripting.FileSystemObject")
strTranslator = objFS.GetBaseName(WScript.FullName)
If StrComp(strTranslator, "cscript", vbTextCompare) = 0 Then
    blnIsConsole = True
Else
    blnIsConsole = False
End If
strLog = objFS.GetBaseName(WScript.ScriptName) & ".csv"
arrCaption = Array("Сервер печати", "Принтер", "Порт принтера", "IP-адрес принтера", "Доступность принтера", _
                    "Общедоступное имя принтера", "Расположение принтера", "Комментарий", _
                    "Поддержка двусторонней печати", "Дубликат")
Set objRoot = GetObject("LDAP://RootDSE")
strDomain = objRoot.Get("DefaultNamingContext")
Set objRoot = Nothing
Set objConnection = CreateObject("ADODB.Connection")
objConnection.Provider = "ADsDSOObject"
objConnection.Open "Active Directory Provider"
Set objCommand = CreateObject("ADODB.Command")
Set objCommand.ActiveConnection = objConnection
strAttributes = "serverName,printerName,portName,printShareName,Location,Description,printDuplexSupported"
objCommand.CommandText = "<LDAP://" & strDomain & ">;(objectCategory=printQueue);" & strAttributes & ";Subtree"
objCommand.Properties("Page Size") = 1000
objCommand.Properties("Timeout") = 30
objCommand.Properties("Sort On") = "serverName"
On Error Resume Next
Set objRSet = objCommand.Execute
If Err.Number = 0 Then
    intNumRecords = objRSet.RecordCount
    If intNumRecords > 0 Then
        Set objDict1 = CreateObject("Scripting.Dictionary"): objDict1.CompareMode = 1
        Set objDict2 = CreateObject("Scripting.Dictionary"): objDict2.CompareMode = 1
        Set objDict3 = CreateObject("Scripting.Dictionary"): objDict3.CompareMode = 1
        strLog = objFS.BuildPath(objFS.GetParentFolderName(WScript.ScriptFullName), strLog)
        Set objFile = objFS.CreateTextFile(strLog, True)
        If Err.Number = 0 Then
            For i = 0 To UBound(arrCaption) - 1
                objFile.Write arrCaption(i) & ";"
            Next
            objFile.WriteLine arrCaption(i)
            If blnIsConsole Then WScript.Echo "Обнаружено записей: " & intNumRecords & vbNewLine & "======"
            objRSet.MoveFirst
            Do Until objRSet.EOF
                strTemp = objRSet.Fields("serverName").Value
                strPrinter = objRSet.Fields("printerName").Value
                If objDict1.Exists(strTemp) Then
                    objDict1.Item(strTemp) = objDict1.Item(strTemp) & ";" & strPrinter
                    arrTemp1 = objRSet.Fields("portName")
                    objDict2.Item(strTemp) = objDict2.Item(strTemp) & ";" & arrTemp1(0)
                Else
                    objDict1.Add strTemp, strPrinter
                    arrTemp1 = objRSet.Fields("portName")
                    objDict2.Add strTemp, arrTemp1(0)
                End If
                If blnIsConsole Then WScript.Echo strTemp & " : " & strPrinter & " -> " & arrTemp1(0)
                strTemp = vbNullString
                For i = 3 To objRSet.Fields.Count - 1
                    strTemp = objRSet.Fields(i).Value
                    If IsNull(strTemp) Then
                        strLine = strLine & ";"
                    Else
                        If IsArray(strTemp) Then
                            strLine = strLine & ";" & Join(strTemp)
                        Else
                            If StrComp(TypeName(strTemp), "Boolean", vbTextCompare) = 0 Then
                                If strTemp Then
                                    strLine = strLine & ";Да"
                                Else
                                    strLine = strLine & ";Нет"
                                End If
                            Else
                                strLine = strLine & ";" & strTemp
                            End If
                        End If
                    End If
                    If Err.Number <> 0 Then Err.Clear
                Next
                objDict3.Add strPrinter, strLine
                strLine = vbNullString
                objRSet.MoveNext
            Loop
            If blnIsConsole Then WScript.Echo "======" & vbNewLine & "Опрос среверов печати" & vbNewLine & "======"
            For Each strTemp In objDict1.Keys
                arrTemp1 = Split(objDict1.Item(strTemp), ";")
                arrTemp2 = Split(objDict2.Item(strTemp), ";")
                If Available(strTemp, blnIsConsole) Then
                    Set objWMI = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strTemp & "\root\CIMV2")
                    For i = 0 To UBound(arrTemp2)
                        Set objCollection = objWMI.ExecQuery("SELECT * FROM Win32_TCPIPPrinterPort WHERE Name='" & arrTemp2(i) & "'")
                        If objCollection.Count > 0 Then
                            For Each objItem In objCollection
                                strIP = objItem.HostAddress
                                If Err.Number = 0 Then
                                    strLine = strTemp & ";" & arrTemp1(i) & ";" & arrTemp2(i) & ";" & strIP
                                Else
                                    Err.Clear
                                End If
                            Next
                        Else
                            strLine = strTemp & ";" & arrTemp1(i) & ";" & arrTemp2(i) & ";Не имеет IP-адреса"
                        End If
                        If Len(strIP) > 0 Then
                            If Available(strIP, blnIsConsole) Then
                                strLine = strLine & ";Да"
                            Else
                                strLine = strLine & ";Нет"
                            End If
                            strIP = vbNullString
                        Else
                            strLine = strLine & ";"
                        End If
                        strLine = strLine & objDict3.Item(arrTemp1(i))
                        If InStr(1, arrTemp1(i), "-", vbTextCompare) > 0 Or _
                            InStr(1, arrTemp1(i), "_", vbTextCompare) > 0 Then
                            strLine = strLine & ";Да"
                        End If
                        objFile.WriteLine strLine
                        strLine = vbNullString
                    Next
                    If blnIsConsole Then WScript.Echo strTemp & " -> опрошен"
                Else
                    For i = 0 To UBound(arrTemp1)
                        strLine = strLine & strTemp & ";" & arrTemp1(i) & ";" & arrTemp2(i) & _
                                    ";Сервер печати не отвечает;" & objDict3.Item(arrTemp1(i))
                        If InStr(1, arrTemp1(i), "-", vbTextCompare) > 0 Or _
                            InStr(1, arrTemp1(i), "_", vbTextCompare) > 0 Then
                            strLine = strLine & ";Да"
                        End If
                        objFile.WriteLine strLine
                        strLine = vbNullString
                    Next
                    If blnIsConsole Then WScript.Echo strTemp & " -> не отвечает"
                End If
            Next
            Erase arrTemp1: Erase arrTemp2
            objFile.Close
            Set objFile = Nothing
            Set objItem = Nothing: Set objCollection = Nothing: Set objWMI = Nothing
            If blnIsConsole Then
                WScript.Echo "======" & vbNewLine & "Путь к файлу отчёта: " & UCase(strLog)
            Else
                Set objWShell = CreateObject("WScript.Shell")
                objWShell.Run "notepad.exe " & strLog, 1
                Set objWShell = Nothing
            End If
        Else
            WScript.Echo "Ошибка создания файла отчёта: " & Err.Number & vbNewLine & Err.Description
            Err.Clear
        End If
        Set objDict1 = Nothing: Set objDict2 = Nothing: Set objDict3 = Nothing
    Else
        WScript.Echo "Ничего не обнаружено."
    End If
Else
    WScript.Echo "Ошибка выполения запроса: " & Err.Number & vbNewLine & Err.Description
    Err.Clear
End If
Set objRSet = Nothing
On Error GoTo 0
Set objCommand = Nothing
objConnection.Close
Set objConnection = Nothing
Set objFS = Nothing
WScript.Quit 0
 
'======
 
Function Available(strName, blnIsCon)
If blnIsCon Then
    Dim objExec, objOutStream, strTemp
    Set objExec = CreateObject("WScript.Shell").Exec("ping -n 1 -w 130 " & strName)
    Set objOutStream = objExec.StdOut
    While Not objOutStream.AtEndOfStream
        strTemp = strTemp & Trim(objOutStream.ReadLine())
    Wend
    Set objOutStream = Nothing
    Set objExec = Nothing
    If InStr(1, strTemp, "TTL", vbTextCompare) > 0 Then
        Available = True
    Else
        Available = False
    End If
Else
    Dim objWMI, objItem
    On Error Resume Next
    Set objWMI = GetObject("winmgmts:{impersonationLevel=impersonate}").ExecQuery("SELECT StatusCode FROM Win32_PingStatus WHERE Address='" & strName & "'")
    If Err.Number = 0 Then
        For Each objItem In objWMI
            If IsNull(objItem.StatusCode) Then
                Available = False
            Else
                Available = (objItem.StatusCode = 0)
            End If
        Next
    Else
        Err.Clear
        Available = False
    End If
    Set objItem = Nothing
    Set objWMI = Nothing
    On Error GoTo 0
End If
End Function
0
0 / 0 / 0
Регистрация: 17.03.2013
Сообщений: 20
21.06.2013, 01:19  [ТС] 18
Я спокойно подключаюсь к принтеру по телнету по стандартному порту.

Добавлено через 6 часов 48 минут
cкрипт классный....все вроде работает как надо!!!
0
2619 / 549 / 109
Регистрация: 21.03.2012
Сообщений: 1,051
24.06.2013, 10:38 19
@Abbadonus, чтобы дело завершилось побыстрее, предлагаю Вам выложить пример Telnet-диалога, который происходит при проверке валидности учётных данных для подключения к принтеру, выполняемой вручную.
На этой основе я попробую "состряпать" соответствующую функцию для сценария. Отлаживать, правда, Вам придётся её самостоятельно.
Разумеется, реальные имена, адреса и пароли мне не нужны.
0
0 / 0 / 0
Регистрация: 17.03.2013
Сообщений: 20
24.06.2013, 11:58  [ТС] 20
Код
telnet pr01111

HP JetDirect
Enter username: test
Enterpassword: *****
Password incorrect

or 

HP JetDirect
Enter username: test
Enterpassword: *****

Please type "menu" for the MENU system,
or "?" for help, or "/" for current settings.
>
0
24.06.2013, 11:58
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.06.2013, 11:58
Помогаю со студенческими работами здесь

Написать скрипт полной инвентаризации пользователей и групп
Помогите пожалуйста, нужно написать скрипт, буду очень благодарен. Написать скрипт полной...

Нужен скрипт для ВК
Подскажите пожалуйста как можно реализовать скрипт для вк,чтобы я вводил в нем ID пользователя,и он...

Нужен скрипт для сайта
Нужен скрипт для сайта который по переключению радиокнопки с одной на другую менял цену. Значения...

нужен скрипт для Куки
Всем привет, не уверен, что пишу в правильном форуме, но мне кажется, что здесь уместнее (если...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru