Компьютерный форум 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=243869)

Anufriev 03-10-2012 10:28 1998836

сканирование ПК на наличие установленных принтеров
 
Добрый день!

мне в сети необходимо найти у кого установлен принтер с определенным IP адресом, компов порядка 300, ручками искать и по пользователям ходить не вариант:(
хотелось бы что бы скрипт писал в файл "имя ПК" кто залогинен и список принтеров которые у него установлены

p.s. задача от руководства ибо к нему на принтер иногда печатается текст за который он хочет наказать печатающего;)

Molchune 03-10-2012 12:33 1998909

Я так понимаю принтер подключен к компу руководства. Так в логах пишется кто печатал когда печатал и с какого ip печатали.

Anufriev 03-10-2012 13:52 1998948

на этом принтере я не нашел логи:(

IT Shepherd 03-10-2012 15:08 1999006

Anufriev, озвучьте каким образом принтер расшарен, ну можно и модель принтера в придачу

Iska 03-10-2012 17:47 1999078

Цитата:

Цитата Anufriev
на этом принтере я не нашел логи »

Включите.

Цитата:

Цитата Dmitrii
Протоколирование успешных событий печати - системная настройка. На серверных платформах "окошек" она включена по умолчанию. На XP включается так:
Папка "Принтеры и факсы" - меню "Файл" - пункт "Свойства сервера" - вкладка "Дополнительные параметры" - "коробочка" "Вести журнал сообщений очереди печати".
На Vista и 7 - не проверял.


Anufriev 04-10-2012 06:01 1999342

принтер HP 1212
он сетевой (к нему все подключаются по IP), у начальника на ПК он не расшарен, поэтому на компе логировать не чего!
на самом принтере логов нет, поэтому и нужно вычислить у кого он установлен

DmitriiV 05-10-2012 14:56 2000007

Anufriev, у вас в организации домен? Если домен, то предлагаю в качестве опорной точки сценарий, решающий описанную задачу для одной станции. Если подобный подход устроит, то можно эту заготовку развивать в нужном направлении.
Код:

Dim objWMI, objCollection, objItem
Dim objReg, arrValueNames, arrValueTypes
Dim strComputer, strDomain, strUser, strSID, strList, strTemp
Const HKU = &H80000003
Const strSubKeyName = "\Software\Microsoft\Windows NT\CurrentVersion\PrinterPorts"

strComputer = "здесь - имя станции"
If Available(strComputer) Then
    Set objWMI = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
    Set objCollection = objWMI.ExecQuery("SELECT UserName FROM Win32_ComputerSystem")
    For Each objItem In objCollection
        strTemp = objItem.UserName
        If IsNull(strTemp) Then strTemp = vbNullString
    Next
    If Len(strTemp) > 0 Then
        strDomain = Split(strTemp, "\")(0)
        strUser = Split(strTemp, "\")(1)
        If StrComp(strComputer, strDomain, vbTextCompare) <> 0 Then
            Set objWMI = GetObject("winmgmts:\\.\root\cimv2")
        Else
            Set objWMI = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
        End If
        Set objAccount = objWMI.Get("Win32_UserAccount.Domain='" & strDomain & "',Name='" & strUser & "'")
        strSID = objAccount.SID
        Set objReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\default:StdRegProv")
        objReg.EnumValues HKU, strSID & strSubKeyName, arrValueNames, arrValueTypes
        For i = 0 To UBound(arrValueNames)
            If Left(arrValueNames(i), 2) = "\\" Then strList = strList & arrValueNames(i) & vbNewLine
        Next
        If Len(strList) > 0 Then
            WScript.Echo "Станция: " & strComputer & vbNewLine & "Пользователь: " & strTemp & vbNewLine & _
                                    "Подключения к сетевым принтерам: " & vbNewLine & strList
        Else
            WScript.Echo "Не найдено ни одного подключения к сетевому принтеру."
        End If
    Else
        WScript.Echo "Сеанс не обнаружен."
    End If
Else
    WScript.Echo "Станция не отвечает."
End If
WScript.Quit 0

'======

Function Available(strName)
Dim objWMI, objItem

Set objWMI = GetObject("winmgmts:").ExecQuery("SELECT StatusCode FROM Win32_PingStatus WHERE Address='" & strName & "'")
For Each objItem In objWMI
    If IsNull(objItem.StatusCode) Or objItem.StatusCode <> 0 Then
        Available = False
    Else
        Available = True
    End If
Next
Set objItem = Nothing
Set objWMI = Nothing
End Function


Anufriev 08-10-2012 07:13 2001192

да у нас домен, можно было бы политикой запустить скрипт по всем машинкам, и собрать отчет

DmitriiV 08-10-2012 13:43 2001349

Цитата:

Цитата Anufriev
... политикой запустить скрипт по всем машинкам, и собрать отчет

Пример сценария для запуска через GPO при начале сеанса пользователя. Журнал будет создан в папке Application Data профиля пользователя (разумеется, можете указать свой путь, но советую добавить проверку на наличие/доступность этого пути).
Код:

Dim objWMI, objWsNet, objAccount
Dim objFS, objFile, strLog
Dim arrValueNames, arrValueTypes
Dim strDomain, strUser, strSID, strList
Const HKU = &H80000003
Const strSubKeyName = "\Software\Microsoft\Windows NT\CurrentVersion\PrinterPorts"
strLog = "_LanPrinters.log"
Set objWsNet = CreateObject("WScript.Network")
strComputer = objWsNet.ComputerName
strDomain = objWsNet.UserDomain
strUser = objWsNet.UserName
Set objWsNet = Nothing
On Error Resume Next
Set objWMI = GetObject("winmgmts:\\.\root\cimv2")
If Err.Number = 0 Then
    Set objAccount = objWMI.Get("Win32_UserAccount.Domain='" & strDomain & "',Name='" & strUser & "'")
    If Err.Number = 0 Then
        strSID = objAccount.SID
        If Err.Number = 0 Then
            Set objAccount = Nothing
            Set objWMI = GetObject("winmgmts:\\.\root\default:StdRegProv")
            If Err.Number = 0 Then
                objWMI.EnumValues HKU, strSID & strSubKeyName, arrValueNames, arrValueTypes
                If Err.Number = 0 Then
                    For i = 0 To UBound(arrValueNames)
                        If Left(arrValueNames(i), 2) = "\\" Then strList = strList & Mid(arrValueNames(i), 3) & ";"
                    Next
                    strLog = CreateObject("Shell.Application").NameSpace(&H1A).Self.Path & "\" & strUser & strLog
                    Set objFS = CreateObject("Scripting.FileSystemObject")
                    Set objFile = objFS.CreateTextFile(strLog, True)
                    If Err.Number = 0 Then
                        If Len(strList) > 0 Then
                            If Right(strList, 1) = ";" Then strList = Mid(strList, 1, Len(strList) - 1)
                            objFile.WriteLine strList
                        End If
                        objFile.Close
                        Set objFile = Nothing
                    Else
                        Err.Clear
                    End If
                    Set objFS = Nothing
                Else
                    Err.Clear
                End If
            Else
                Err.Clear
            End If
        Else
            Err.Clear
        End If
    Else
        Err.Clear
    End If
    Set objWMI = Nothing
Else
    Err.Clear
End If
WScript.Quit 0

Диагностику ошибок, если нужна, добавляйте самостоятельно.

Anufriev 10-10-2012 07:05 2002479

Цитата:

Журнал будет создан в папке Application Data профиля пользователя
все хорошо, а где данная строка, что бы изменить путь?

DmitriiV 10-10-2012 07:50 2002485

Код:

CreateObject("Shell.Application").NameSpace(&H1a).Self.Path


Время: 19:22.

Время: 19:22.
© OSzone.net 2001-