none
Сбор данных по пользователям и пк, на которых они работают RRS feed

  • Вопрос

  • Не знаю куда написать, но скорей все сведется к скрипту vbs наверно. Возникла задача. Необходимо собирать данные на каком ПК какой пользователь работает и записывать эти данные в расшаренную папку в файл на один из серверов. При этом если пользователь заходит на терминальные сервера, то информация в этот файл записываться не должна. То есть я так понимаю нужно создать OU, поместить туда терминальные сервера и сделать условие на этом факторе. Если сервер находится в OU таком-то, то ничего не делать. Я так понимаю что тут надо использовать Wmi фильтр. Можно ли это все сделать через GPO? Есть ли варианты помимо логон скрипта(у каждого пользователя уже есть логон скрипты vbs по подразделениям со своими задачами)?

    14 апреля 2013 г. 12:35

Ответы

  • ... если пользователь заходит на терминальные сервера, то информация в этот файл записываться не должна...

    Тип пользовательского сеанса несложно определить в самом сценарии (проверено для ОС XP/2003/2008/7):

    Set objShell = CreateObject("WScript.Shell")
    If UCase(objShell.ExpandEnvironmentStrings("%SESSIONNAME%")) = "CONSOLE" Then
        WScript.Echo "Интерактивный сеанс."
    Else
        WScript.Echo "Не интерактивный сеанс."
    End If

    • Помечено в качестве ответа osr_MVP, Moderator 17 апреля 2013 г. 3:09
    16 апреля 2013 г. 5:30

Все ответы

  • Я так понимаю что тут надо использовать Wmi фильтр.

    Нет, еще можно, даже лучше использовать loopback processing policy в режиме Replace, настроенную для OU, в которой вы разместите терминальные сервера.

    Не отказывайтесь от logon-скриптов, они наиболее удобные для решения вашей задачи. Тем более logon-скриптов может быть несколько. Здесь подойдет даже простейший cmd-файл, поскольку вам лишь нужно сохранять переменные %computername% и %username% в файл (лучше - в отдельный файл для каждого компьютера) в сетевой папке.

    14 апреля 2013 г. 13:01
    Модератор
  • Я так понимаю что тут надо использовать Wmi фильтр.

    Нет, еще можно, даже лучше использовать loopback processing policy в режиме Replace, настроенную для OU, в которой вы разместите терминальные сервера.

    Не отказывайтесь от logon-скриптов, они наиболее удобные для решения вашей задачи. Тем более logon-скриптов может быть несколько. Здесь подойдет даже простейший cmd-файл, поскольку вам лишь нужно сохранять переменные %computername% и %username% в файл (лучше - в отдельный файл для каждого компьютера) в сетевой папке.

    А можете привести пример скрипта для выполнения данной задачи?
    Что-то типа такого:

    echo %username% on %computername% > \\server\share\logon.txt

    ?

    • Изменено winwine 14 апреля 2013 г. 17:10
    14 апреля 2013 г. 17:08
  • echo %username% > \\server\share\%computername%.txt

    или / и наоборот, чтобы получить набор файлов, отсортированных по именам компьютеров / пользователей. В файлах вы можете собирать и другую полезную информацию, например, конфигурацию TCP/IP (ipconfig /all), подключенные сетевые диски (net use)  и многое другое.


    14 апреля 2013 г. 17:36
    Модератор
  • А каким образом можно собирать например данные по сетевым дискам? Как будет выглядеть скрипт

    14 апреля 2013 г. 19:52
  • Например, так:

    @echo off
    Set LogFileName=\\server\share\%COMPUTERNAME%.txt
    echo User: %USERNAME% > %LogFileName%
    echo Logon Date/Time: %DATE% %TIME:~0,8% >> %LogFileName%
    ver >> %LogFileName%
    echo. >> %LogFileName%
    ipconfig /all >> %LogFileName%
    net use >> %LogFileName%

    15 апреля 2013 г. 6:27
    Модератор
  • osr_

    Спасибо за примеры. Как вывести данные в внешний источник понятно. Возник еще вопрос. Сейчас в скриптах по подразделениям впринципе тоже собираеются данные таким образом:

    Sub SafeUCinformationtoAD()
    On Error Resume Next
    Dim adsinfo, ThisComp, oUser
    
    ' Определяем объекты
    Set adsinfo = CreateObject("adsysteminfo")
    Set ThisComp = GetObject("LDAP://" & adsinfo.ComputerName)
    Set oUser = GetObject("LDAP://" & adsinfo.UserName)
    
    ' Заносим данные в AD
    ' В поле Department компьютера пишем имя пользователя, и время входа
    Thiscomp.put "description", oUser.cn 
    ThisComp.Setinfo
    
    'В поле Department учетки пользователя пишем имя компьютера и время входа
    oUser.put "extensionAttribute1", ThisComp.cn
    oUser.Setinfo
    end sub

    Для того, чтобы он вносил правильные данные(не показывал вход на терминальные сервера) впринципе тоже должно хватить использование отдельного OU для терминальных серверов и loopback processing policy в режиме Replace. Тогда можно и ограничится только loopback processing policy(если не потребуется отдельно выводить данные. Правильно?

    15 апреля 2013 г. 8:51
  • Правильно. Вы назначаете GPO с данным скриптом на OU, в котором (в иерархии которого) находятся пользователи, а OU с терминальными серверами у вас в другом месте. На него вы назначаете GPO без данного скрипта и включаете в этом GPO (или в другом, но так чтобы GPO применялся к терминальным серверам) loopback processing policy.
    15 апреля 2013 г. 9:11
    Модератор
  • ... если пользователь заходит на терминальные сервера, то информация в этот файл записываться не должна...

    Тип пользовательского сеанса несложно определить в самом сценарии (проверено для ОС XP/2003/2008/7):

    Set objShell = CreateObject("WScript.Shell")
    If UCase(objShell.ExpandEnvironmentStrings("%SESSIONNAME%")) = "CONSOLE" Then
        WScript.Echo "Интерактивный сеанс."
    Else
        WScript.Echo "Не интерактивный сеанс."
    End If

    • Помечено в качестве ответа osr_MVP, Moderator 17 апреля 2013 г. 3:09
    16 апреля 2013 г. 5:30
  • DmitriiV, спасибо

    А каким образом в vbs будет аналог echo %computername% > \\server\share\%username%.txt? То есть как получается будет выглядить скрипт vbs. который будет записавать на какой ПК зашел пользователь, но если это терминальный сервер - то не вносить изменения?


    • Изменено winwine 16 апреля 2013 г. 13:19
    16 апреля 2013 г. 13:18
  • Например, так:

    Dim objShell, objFS, objFile
    Dim strUser, strComputer, strLogFolder
    strLogFolder = "\\server\share\"
    Set objShell = CreateObject("WScript.Shell")
    If UCase(objShell.ExpandEnvironmentStrings("%SESSIONNAME%")) = "CONSOLE" Then
        strComputer = objShell.ExpandEnvironmentStrings("%COMPUTERNAME%")
        strUser = objShell.ExpandEnvironmentStrings("%USERNAME%")
        Set objFS = CreateObject("Scripting.FileSystemObject")
        If objFS.FolderExists(strLogFolder) Then
            Set objFile = objFS.OpenTextFile(strLogFolder & strUser & ".txt", 2, True)
            objFile.WriteLine strComputer
            objFile.Close
            Set objFile = Nothing
        End If
        Set objFS = Nothing
    End If
    Set objShell = Nothing
    WScript.Quit 0
    17 апреля 2013 г. 3:25
  • DmitriiV

    Странно - но что-то ничего не записалось в расшаренную папку. Пробывал через VMware на тестовый ПК консольно зайти под пользователем, у которого был в логоне такой скрипт - на выходе ничего. Если ставить пользователю cmd/bat c echo %computername% > \\server\share\%username%.txt - все работает без проблем

    Немного задача еще изменилась -  именем выходного фаила должно быть имя пользователя, а в файле через раздилитель имя пользователя и имя пк.
    • Изменено winwine 17 апреля 2013 г. 7:35
    17 апреля 2013 г. 6:30
  • Какова версия тестируемой ОС?
    17 апреля 2013 г. 9:47
  • Впрочем, думается речь идёт о версиях 2008/7.
    Должен принести свои извинения за не вполне корректное тестирование предложенного решения. Дело в том, что существует проблема чтения значений некоторых переменных среды окружения средствами объекта WshShell в ОС этих версий, если сценарий работает в составе групповой политики. В частности переменная SESSIONNAME попросту не идентифицируется. Поэтому сценарий должен быть более сложным:

    Dim objSysInfo, strComputer, strUser, strTemp, intTemp
    Dim objFS, objFile, objWMI, arrSubKeys, strLogFolder
    Const HKCU = &H80000001
    strLogFolder = "\\server\share\"
    Set objSysInfo = CreateObject("ADSystemInfo")
    strComputer = GetObject("LDAP://" & objSysInfo.ComputerName).cn
    strUser = GetObject("LDAP://" & objSysInfo.UserName).cn
    strTemp = LCase(GetObject("LDAP://" & objSysInfo.ComputerName).operatingSystemVersion)
    Set objSysInfo = Nothing
    If Len(strTemp) > 0 Then
        intTemp = CInt(Replace(Left(strTemp, 3), ".", ""))
        If intTemp > 52 Then
            Set objWMI = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv")
            objWMI.EnumKey HKCU, "Volatile Environment", arrSubKeys
            objWMI.GetStringValue HKCU, "Volatile Environment\" & arrSubKeys(UBound(arrSubKeys)), "SESSIONNAME", strTemp
            Set objWMI = Nothing
        Else
            strTemp = CreateObject("WScript.Shell").Environment("Volatile").Item("SESSIONNAME")
        End If
        If UCase(strTemp) = "CONSOLE" Then
            Set objFS = CreateObject("Scripting.FileSystemObject")
            If objFS.FolderExists(strLogFolder) Then
                Set objFile = objFS.OpenTextFile(strLogFolder & strUser & ".txt", 2, True)
                objFile.WriteLine strComputer
                objFile.Close
                Set objFile = Nothing
            End If
            Set objFS = Nothing
        End If
    End If
    WScript.Quit 0

    Увы мне, я уже натыкался именно на эти "грабли", но напрочь о том позабыл.

    • Изменено DmitriiV 17 апреля 2013 г. 11:19
    17 апреля 2013 г. 11:15
  • DmitriiV

    Речь идет о 2003/2008  и клиентах с 7. Выполнение на 2003 не требуется. Но что-то он ничего не записалось в указанную директорию И каким образом можно добавить ,чтобы на выходе создавался файл с  именем пользователя, а в файле через раздилитель было имя пользователя и имя пк?


    • Изменено winwine 17 апреля 2013 г. 15:15
    17 апреля 2013 г. 15:09
  • ... ничего не записалось в указанную директорию...

    Займитесь отладкой.

    1. Добавьте в код сценария отладочные операторы (один из вариантов - в примере ниже).
    2. Запустите сценарий вручную из-под зарегистрированных интерактивного и удалённого сеансов и оцените результаты.
    3. Если запущенный вручную сценарий отработает правильно, то включите его в групповую политику тестового подразделения, зарегистрируйте интерактивный и удалённый сеансы и вновь оцените результаты.

    Dim objSysInfo, strTemp, intTemp
    Dim strComputer, strUser, strLogFolder
    Dim objFS, objFile, objWMI, arrSubKeys
    Const HKCU = &H80000001
    strLogFolder = "\\server\share\"
    Set objSysInfo = CreateObject("ADSystemInfo")
    strComputer = GetObject("LDAP://" & objSysInfo.ComputerName).cn
    strUser = GetObject("LDAP://" & objSysInfo.UserName).cn
    strTemp = LCase(GetObject("LDAP://" & objSysInfo.ComputerName).operatingSystemVersion)
    Set objSysInfo = Nothing
    WScript.Echo "Пользователь: " & strUser & vbNewLine & "Станция: " & strComputer & vbNewLine & "Версия ОС: " & strTemp
    If Len(strTemp) > 0 Then
        intTemp = CInt(Replace(Left(strTemp, 3), ".", ""))
        If intTemp > 52 Then
            WScript.Echo "ОС пост-Vista."
            Set objWMI = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv")
            objWMI.EnumKey HKCU, "Volatile Environment", arrSubKeys
            WScript.Echo "В ветке HKCU\Volatile Environment найдено подразделов: " & UBound(arrSubKeys) + 1 & vbNewLine & _
                        "Последним создан подраздел HKCU\Volatile Environment\" & arrSubKeys(UBound(arrSubKeys))
            objWMI.GetStringValue HKCU, "Volatile Environment\" & arrSubKeys(UBound(arrSubKeys)), "SESSIONNAME", strTemp
            Set objWMI = Nothing
            If Len(strTemp) > 0 Then
                WScript.Echo "Значение параметра HKCU\Volatile Environment\SESSIONNAME : " & strTemp
            Else
                WScript.Echo "Значение параметра HKCU\Volatile Environment\SESSIONNAME не задано."
            End If
        Else
            WScript.Echo "ОС пред-Vista."
            strTemp = CreateObject("WScript.Shell").Environment("Volatile").Item("SESSIONNAME")
        End If
            WScript.Echo "Тип сеанса: " & strTemp
        If UCase(strTemp) = "CONSOLE" Then
            WScript.Echo "Интерактивный вход."
            Set objFS = CreateObject("Scripting.FileSystemObject")
            If objFS.FolderExists(strLogFolder) Then
                WScript.Echo "Путь " & UCase(strLogFolder) & " найден." & vbNewLine & _
                            "Полный путь к создаваемому файлу: " & UCase(strLogFolder & strUser & ".txt")
                Set objFile = objFS.OpenTextFile(strLogFolder & strUser & ".txt", 2, True)
                objFile.WriteLine strComputer
                objFile.Close
                Set objFile = Nothing
                WScript.Echo "Файл успешно создан."
            Else
                WScript.Echo "Не найден путь " & UCase(strLogFolder)
            End If
            Set objFS = Nothing
        Else
            WScript.Echo "Не интерактивный вход."
        End If
    Else
        WScript.Echo "Тип ОС не определён."
    End If
    WScript.Quit 0

    ... в файле через раздилитель было имя пользователя и имя пк...

    Например, так:

    objFile.WriteLine strUser & " = " & strComputer
    • Изменено DmitriiV 18 апреля 2013 г. 7:04
    18 апреля 2013 г. 7:02
  • osr_, DmitriiV

    Спасибо за помощь.

    19 апреля 2013 г. 13:53