— Ой, у меня ничего не работает, помогите!
— Не переживайте, сейчас всё исправим. Назовите имя компьютера…
(классика жанра из звонков в техподдержку)

Хорошо, если у вас есть инструмент а-ля BgInfo или ваши пользователи знают про шорткат Windows+Pause/Break и умеют его нажимать. Встречаются даже редкие экземпляры, которые успели выучить имя своей машины. Но часто у звонящего вдобавок к его основной проблеме появляется вторая: узнать имя/IP-адрес компьютера. И нередко на решение этой второй проблемы уходит куда больше времени, чем первой (а надо было всего лишь обои поменять или вернуть пропавший ярлык :).
А ведь намного приятнее услышать что-то вроде:
— Татьяна Сергеевна, не беспокойтесь, уже подключаюсь…


А надо для этого не так уж и много.
Специалисту техподдержки достаточно лишь выучить наизусть имена машин и помнить, кто за какой работает.
Перед описанием решения, которым мы пользуемся сейчас, я кратко рассмотрю другие варианты, чтобы раскритиковать их в пух и прах объяснить свой выбор.

  1. BgInfo, Desktop Info и им подобные. Если много денег, есть и платные. Суть в том, что на десктоп выводится техническая информация: имя машины, IP-адрес, логин и т.д. В Desktop Info можно даже графики производительности запилить на половину экрана.
    Не устраивает то, что для того же Bginfo, например, пользователю нужно сворачивать окна, чтобы увидеть нужные данные. Еще мы с коллегами не раз наблюдали у BgInfo характерный артефакт, когда новый текст выводится поверх старого.
    Некоторых пользователей раздражает тот факт, что админы рисуют пугающее 192.168.0.123 на мордочке растянувшегося на рабочем столе котика портят эстетику фоновой картинки, и, разумеется, это жутко демотивирует и напрочь убивает рабочий настрой.
  2. Ярлык а-ля «Кто я» (не пытайтесь добавить ему знак вопроса в конце :). Классический ярлык на рабочем столе, за которым прячется аккуратный или не очень скрипт, выводящий нужную информацию в виде диалогового окна. Иногда вместо ярлыка на рабочий стол кладут сам скрипт, что ИМХО моветон.
    Недостаток в том, что для запуска ярлыка, как и в первом случае, нужно сворачивать все открытые окна (баловней судьбы, у которых на рабочей машине открыто единственное окно с пасьянсом, в расчет не берём). Кстати, а ваши пользователи знают, куда нужно тыкнуть, чтобы свернуть все окна? Правильно, пальцем в глаз админу.

Также кэп подсказывает, что у обоих описанных выше способов основной недостаток в том, что в получении информации участвует пользователь, который может быть подслеповат, глуп и вообще соврать.
Вариант с повышением компьютерной грамотности, когда все знают, где в Windows смотреть имя своей машины, рассматривать не буду: дело благородное, но очень трудное. А если в компании текучка кадров, то и вовсе гиблое. Что там говорить, в большинстве случаев и логин-то свой не помнят.

Душу излил, а теперь к делу.
За основу была взята идея хабровчанина mittel из этой статьи.
Суть задумки в том, что при входе пользователя в Windows логон-скрипт заносит нужную информацию (время и имя машины) в определенный атрибут учётной записи пользователя. А при выходе из системы отрабатывает аналогичный логофф-скрипт.

Сама идея мне понравилась, а вот в реализации кое-что не устроило.
  1. Групповая политика, в которой прописаны логон- и логофф-скрипты для пользователей, применяется ко всему домену, поэтому скрипты будут отрабатывать на любой машине, на которую логинятся пользователи. Если у вас наряду с рабочими станциями используются терминальные решения (например, Microsoft RDS или продукты Citrix), такой подход будет неудобным.
  2. Данные заносятся в атрибут Department учетной записи пользователя, на который у рядового пользователя есть доступ только на чтение. Помимо атрибута учётной записи пользователя, скрипт также вносит изменения в атрибут Department учётной записи компьютера, который по умолчанию пользователи также менять не могут. Поэтому чтобы решение работало, автор предлагает изменить стандартые настройки безопасности для объектов AD.
  3. Формат даты зависит от настроек локализации на конечной машине, поэтому с одной машины можем получить 10 ноября 2018 14:53, а с другой 11/10/18 2:53 p.m.


Для устранения этих недостатков было сделано следующее.
  1. GPO линкуется не к домену, а к OU с машинами (я разделяю пользователей и машины по разным OU и другим советую). При этом для loopback policy processing mode выставлен режим merge.
  2. Скрипт будет заносить данные только в учетную запись пользователя в атрибут Info, который пользователь может менять самостоятельно для своей учётной записи.
  3. Изменен кусок кода, генерирующий значение атрибута


Теперь скрипты выглядят так:
SaveLogonInfoToAdUserAttrib.vbs
On Error Resume Next
Set wshShell = CreateObject("WScript.Shell")
strComputerName = wshShell.ExpandEnvironmentStrings("%COMPUTERNAME%")
Set adsinfo = CreateObject("ADSystemInfo")
Set oUser = GetObject("LDAP://" & adsinfo.UserName)
strMonth = Month(Now())
If Len(strMonth) < 2 then
  strMonth = "0" & strMonth
End If
strDay = Day(Now())
If Len(strDay) < 2 then
  strDay = "0" & strDay
End If
strTime = FormatDateTime(Now(),vbLongTime)
If Len(strTime) < 8 then
  strTime = "0" & strTime
End If
strTimeStamp = Year(Now()) & "/" & strMonth & "/" & strDay & " " & strTime
oUser.put "info", strTimeStamp & " <logon>" & " @ " & strComputerName
oUser.Setinfo


SaveLogoffInfoToAdUserAttrib.vbs
On Error Resume Next
Set wshShell = CreateObject("WScript.Shell")
strComputerName = wshShell.ExpandEnvironmentStrings("%COMPUTERNAME%")
Set adsinfo = CreateObject("ADSystemInfo")
Set oUser = GetObject("LDAP://" & adsinfo.UserName)
strMonth = Month(Now())
If Len(strMonth) < 2 then
  strMonth = "0" & strMonth
End If
strDay = Day(Now())
If Len(strDay) < 2 then
  strDay = "0" & strDay
End If
strTime = FormatDateTime(Now(),vbLongTime)
If Len(strTime) < 8 then
  strTime = "0" & strTime
End If
strTimeStamp = Year(Now()) & "/" & strMonth & "/" & strDay & " " & strTime
oUser.put "info", strTimeStamp & " <logoff>" & " @ " & strComputerName
oUser.Setinfo



Кто первым найдет все отличия между логон- и логофф-скриптом, тому плюс в карму. :)
Также для получения наглядной информации создан такой небольшой PS-скрипт:
Get-UsersByPCsInfo.ps1
$OU = "OU=MyUsers,DC=mydomain,DC=com"
Get-ADUser -SearchBase $OU -Properties * -Filter * | Select-Object DisplayName, SamAccountName, info | Sort DisplayName | Out-GridView -Title "Информация по логонам" -Wait



Итого всё настраивается на раз-два-три:
  1. создаем GPO с нужными настройками и линкуем его к подразделению с рабочими станциями пользователей:

  2. идем пить чай (если AD с большим количеством пользователей, то чая нужно много :)
  3. запускам PS-скрипт и получаем результат:

    В верхней части окна есть удобный фильтр, в котором можно отбирать данные по значениям одного или нескольких полей. Клик по столбцам таблицы сортирует записи по значениям соответствующих полей.


Можно красиво «упаковать» наше решение.

Для этого добавим ярлык для запуска скрипта специалистам техподдержки, у которого в поле «объект» будет что-то такое:
powershell.exe -NoLogo -ExecutionPolicy Bypass -File "\\server\share\Scripts\Get-UsersByPCsInfo.ps1"

Если сотрудников техподдержки много, то можно раздать ярлык с помощью GPP.

Несколько замечаний напоследок.
  • На машине, откуда запускается PS-скрипт, должен быть установлен модуль Active Directory для PowerShell (для этого достаточно добавить средства администрирования AD в компонентах Windows).
  • бОльшую часть атрибутов своей учётной записи пользователь по умолчанию редактировать не может. Учитывайте это, если решите использовать атрибут, отличный от Info.
  • Проинформируйте всех причастных коллег о том, какой атрибут будете использовать. Например, тот же Info используется для интерактивного добавления заметок к ящику пользователя в админке Exchange Server и кто-то легко может его затереть, либо опечалился, когда добавленную им информацию затрет ваш скрипт.
  • Если у вас несколько сайтов Active Directory, то делайте поправку на задержки репликации. Например, если вы хотите получить актуальную информацию о пользователях с AD-сайта A, а запускаете скрипт с машины из AD-сайта B, то можно сделать так:
    Get-ADUser -Server DCfromSiteA -SearchBase $OU -Properties * -Filter * | Select-Object DisplayName, SamAccountName, info | Sort DisplayName | Out-GridView -Title "Информация по логонам" -Wait

    DCfromSiteA — имя контроллера домена сайта A (по умолчанию командлет Get-AdUser подключается к ближайшему контроллеру домена)



Источник картинок

Буду признателен, если вы пройдете короткий опрос ниже.

Комментарии (69)


  1. Dimtry44
    05.09.2019 21:18

    1. Попросить пользователя выключить и включить компьютер, по информации из AD существенно сузится круг подозреваемых. Если у вас не тысячи пользователей в этом офисе или это не в девять утра, то по идее должно быть достаточно для идентификации пользователя.

    2. Для полу-оффлайн режима (когда компьютер кажется работает, а монитор/мышь/клавиатура не очень), на мородочку/бока всем компьютерам налепить QR код с ссылкой, попросить пользователя сфотать телефоном и перейти по ссылке. Ссылка содрежит уникальное имя компьютера. Можно вдобавок иметь на этом иметь цифровой код ассоциированный с компьютером, который пользователь может прочитать по телефону.


    1. Miller777
      06.09.2019 13:55
      +1

      1. представил себе буха в разгар рабочего дня. открыто 3 базы 1С,5 таблиц в Excel, отчётность, «консультант плюс» и прочее. И тут вы ей предлагаете выключить компьютер…

      2. Overhead. А чего на наклейке сразу имя ПК не писать?


      1. Dimtry44
        06.09.2019 16:00

        И тут вы ей предлагаете выключить компьютер…
        Бух такой важный… когда хочет показать свою важность, а когда никого чужих нету, то и выключит и включит, не зависимо от количества открытых программ. Ну если альтернатива потратить полчаса пытаясь определить что за компьютер, то может быть и решение. Я же не предлагаю делать так всегда, только в граничных случаях, когда уже совсем туго.
        Overhead. А чего на наклейке сразу имя ПК не писать?
        По-русски имена компьютерам не дают, а по английски будет куча ошибок при попытке его прочитать, особенно если система именования не продумана. А цифры проще, плюс можно две последние оставить для контрольной суммы, чтобы сразу было понятно что ошибка где-то закралась.


        1. andToxa
          06.09.2019 16:21

          Бух такой важный…

          бухи бывают разные… а если у него отчет в это время в фоне в ЦБ формируется/отправляется? или проводки по реестру от яндекс.такси?


          налепить QR код

          в организации с 20+ работниками это работает максимум полгода


        1. gecube
          06.09.2019 16:56

          Бух такой важный… когда хочет показать свою важность, а когда никого чужих нету, то и выключит и включит, не зависимо от количества открытых программ. Ну если альтернатива потратить полчаса пытаясь определить что за компьютер, то может быть и решение. Я же не предлагаю делать так всегда, только в граничных случаях, когда уже совсем туго.

          А как насчет того, что после перезагрузки бух не сможет повторить дефект? Вообще гениальное предложение. А что? Действительно — сломалось что-то — выключи — включи.


        1. Miller777
          06.09.2019 17:24

          Насчет 2-го — согласен. Наелся этого по уши, когда тебе начинает по телефону диктовать пароль к TeamViewer человек, у которого очень плохо с английским. Игра «угадай пароль».

          Насчет первого — не соглашусь. Когда у бухов разгар работы — им бывает вообще не оторваться. Некритичные ошибки и проблемы откладываются на потом.


          1. andToxa
            06.09.2019 17:46

            если речь, про TeamViewer, то пусть уж тогда вам пароль через вацап отправляют. там и запоминать не надо.
            ps: имхо мы отошли от изначальной постановки задачи (узнать имя ПК пользователем или админом).


  1. 200sx_Pilot
    05.09.2019 21:56

    Инвентарный номер не подойдёт?
    вида «организация.отдел.сотрудник».


    1. perlestius Автор
      05.09.2019 22:19

      Не совсем понял мысль. Можно подробнее?


      1. 200sx_Pilot
        05.09.2019 23:26

        в крупных предприятиях кодируются структурные подразделения.
        1.технологи
        2.производство.

        5.бухгалтерия

        9.отдел энергетика

        на компе наклейка «12.7.21»
        На русском означает «администрация.клининг-менеджер.Марина»
        в саппорте по наклейке карточка компа, привязанная к карточке сотрудника, в которой есть в т.ч. номер мобильного, с которого Марина может позвонить, номер её местного телефона.
        а в карточке — всё, чего душа пожелает, включая температуру дисков и обороты вентилятора БП.

        зы: это для первой части задачи и чтобы не усложнять qr кодами.
        чёй-то «предпросмотр» и «отправить» неактивны… :(


        1. perlestius Автор
          05.09.2019 23:50

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


        1. Rim13
          06.09.2019 09:54

          Если внутренние номера статичны, то привязку к ним можно делать, в плане определения имя компа.


    1. andToxa
      06.09.2019 17:03

      а если ПК заливаются с помощью WDS/SCCM и имена генерируются автоматически?
      а если завтра бухгалтерия решит поменять формат инвентарных номеров (с 1234 на 60402-1234)?


    1. fessmage
      07.09.2019 07:28

      Как раз использовал схему с инвентарным номером. При подготовке каждого ПК перед сдачей в работу на него клеился на видном для пользователя месте инвентарник, а имя ПК задавалось по стандарту "номер офиса-инвентарный номер". Соответственно при обращении просто спрашивали откуда человек звонит и просили продиктовать номер с наклейки.
      Зачем добавлять в номер еще конкретного сотрудника — не очень понятно, ведь он сегодня за одним ПК, а завтра в другом офисе за другим.
      Но это не отменяет удобства хранения информации о логинах в AD в удобном виде — когда нужно что-то сделать без присутствия человека (например ушел на обед, отправив тикет). И странно что в AD до сих пор нет удобного места для хранения и просмотра такой информации — либо парсить логи входа на всех контроллерах и агрегировать, либо как у автора — кастомные логон скрипты и кастомное поле у пользователя.


  1. AkshinM
    05.09.2019 22:02

    Просто оставлю это здесь тыц и это тыц


    1. stratofort
      05.09.2019 23:11

      Вот со всеми описаниями http://winitpro.ru/index.php/2019/08/13/set-adcomputer-powershell/


      Я немного по другому делаю. Оно ещё в базу пишет.


    1. stratofort
      05.09.2019 23:13

      Сорри промахнулся


  1. stratofort
    05.09.2019 22:11

    Хм. Логон и логофф скрипт. Отдельно на машины отдельно на юзверя. Работает 7 лет. В оснастке Ad видно кто на какой машине. Только права раздать на атрибуты правильно нужно. И вообще политики не на весь домен можно кидать. А на отдельные ou


    1. perlestius Автор
      05.09.2019 22:16

      Интересно взглянуть на Ваши логон/логофф-скрипты для машины. Каким образом машина узнает, кто на ней залогинен с учетом того, что сначала отрабатывает логон-скрипт для машины, а уже потом для пользователя?


      1. stratofort
        05.09.2019 23:06

        Завтра утром по msk кину. И где правильно права дать


      1. stratofort
        05.09.2019 23:12

        Так скрипт отрабатывает на пользователя. И он пишет на нужный атрибут.


      1. stratofort
        05.09.2019 23:13

        Вот со всеми описаниями http://winitpro.ru/index.php/2019/08/13/set-adcomputer-powershell/


        Я немного по другому делаю. Оно ещё в базу пишет


        1. perlestius Автор
          05.09.2019 23:41

          В самом начале статьи по Вашей ссылке:

          Командлет Set-ADComputer входит в состав модуля Active Directory для PowerShell и требует наличие установленного модуля на компьютере.

          У Вас на всех рабочих станциях ADUC установлен?
          VBS-скрипты из моего решения этого не требуют, будут запускаться даже на старых ОС, а скорость выполнения будет значительно выше, чем у их PS-аналогов из Вашей статьи.

          И, как я писал выше с статье, вот эта модификация мне не очень нравится:
          В первую очередь необходимо делегировать права группе Domain Users (или другой группе безопасности пользователей) на OU с компьютерами на изменение значений в полях объктов типа Computer: ManagedBy и description (Write Description + Write Managed By).


          В моём же варианте всё работает «из коробки», со стандартными настройками безопасности.


          1. stratofort
            06.09.2019 11:02

            Это ссылка для примера была.
            У меня тоже через vbs скрипт сделано

            On Error Resume Next

            Set objSysInfo = CreateObject(«ADSystemInfo»)
            Set objNetwork = CreateObject(«WScript.Network»)
            Set objUser = GetObject(«LDAP://» & objSysInfo.UserName)
            Set objComp = GetObject(«LDAP://» & objSysInfo.ComputerName)
            strFullName = objUser.Get(«displayName»)

            objUser.Put «description», objNetwork.ComputerName & " login " & Date
            objUser.SetInfo
            objComp.Put «description», strFullName & " login " & Date
            objComp.SetInfo

            И в оснастке Ад в поле комментарий видно кто куда залогинен. Как на машине так и у пользователя

            Пользователю даны права в АД на изменения поля description


  1. ryo_oh_ki
    05.09.2019 22:19

    В Security EventLog'а пишется событие ID 4624 (4625) с информацией о логине пользователя, если включить «Audit logon events» в полиси.

    P.S. На компьютер может быть залогинено несколько пользователей одновременно.


    1. perlestius Автор
      05.09.2019 22:25

      В Security EventLog'а пишется событие ID 4624 (4625) с информацией о логине пользователя, если включить «Audit logon events» в полиси.

      Вы пробовали парсить Security-логи, скажем, для организации, где тысяча пользователей и с десяток контроллеров домена?
      P.S. На компьютер может быть залогинено несколько пользователей одновременно.

      И что из этого следует?


      1. ryo_oh_ki
        05.09.2019 22:34

        PowerShell позволяет. Но если контроллеров действительно много и пользователь может логиниться на любом, что странно… то посоветую запускать скрипты параллельно удалёно на каждом (например, Invoke-Command), а не один скрипт, чтобы не пересылать логи со всех на свой.


        1. perlestius Автор
          05.09.2019 23:56

          и пользователь может логиниться на любом, что странно…

          Что тут странного? Это стандартное поведение AD.

          то посоветую запускать скрипты параллельно удалёно на каждом

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


          1. ryo_oh_ki
            06.09.2019 06:36

            Что тут странного? Это стандартное поведение AD.

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

            Что вас пугает в параллельном запуске скриптов на контроллерах?
            И что из этого следует?

            Так как вы в вашем скрипте решили проблему одновременного логина пользователя на нескольких машинах? Ведь, если не ошибаюсь, то новый логин будет перезаписывать атрибут со старым, но ещё актуальным логином.
            (Типичный пример в сетях 1Г и строже: пользователь имеет личную машину, но для вывода информации должен приходить со своей флешкой на машину с открытыми USB-портами).


            1. perlestius Автор
              06.09.2019 07:51

              складывается впечатление, что в вашей организации много контроллеров без географического разделения (т.е. без необходимости).

              Совсем нет. К примеру, 5 площадок с парой DC в каждой.

              Что вас пугает в параллельном запуске скриптов на контроллерах?

              Я не про параллельный запуск, а вообще про парсинг. Не пугает ничего,, если это не в моей AD творится. :) Парсинг таких логов — ресурсоёмкая операция, и я бы не стал на DC ее запускать. Как Вы планируете это реализовать на практике? Вручную по мере надобности? По расписанию автоматом? За какой период будете смотреть, как и куда выгружать результаты?

              Ведь, если не ошибаюсь, то новый логин будет перезаписывать атрибут со старым, но ещё актуальным логином.

              Да, всё верно.

              пользователь имеет личную машину, но для вывода информации должен приходить со своей флешкой на машину с открытыми USB-портами

              Согласен, есть нюансы.
              Как вариант. Кладём учётку такой «открытой» машины в отдельный OU, к которому не применяется GPO. В случае проблем на этой машине пользователь сообщает, что, мол, я сейчас не за своим ПК, а за «открытым». Техподдержка со своей стороны видит имя этой машины в ADUC. Либо на самой машине есть наклейка с номером/сетевым именем (если машин несколько).


              1. gecube
                06.09.2019 09:04

                Да, всё верно.

                Но это же убивает изначальную идею на корню!?
                Насчёт секьюрити — ивентов. Нет проблемы, если Вы их парсите и складываете в отдельный сторедж, а потом уже именно его опрашиваете. Минус такого решения, что нужно тащить ещё один компонент. В этом отношении ps-скрипты попросту выглядят проще (но совершенно необязательно, что это более хороший способ).


                И если уж так рассуждать, то почему обязательно на АД садиться? Во многих компаниях есть что-то вроде Корп портала или системы учёта времени сотрудников. Вот по Корп порталу можно отследить кто и с какой машины залогинился (по айпи). Я не скажу, что это сильно лучше, чем с АД, но как вариант — почему нет?


                1. perlestius Автор
                  06.09.2019 09:18

                  Но это же убивает изначальную идею на корню!?

                  Почему Вы так считаете? Задача — оперативно узнать, за какой машиной сейчас работает пользователь, чтобы удаленно подключиться/выполнить диагностику. Сбор истории — это уже другая задача.

                  И если уж так рассуждать, то почему обязательно на АД садиться?

                  Описанное в статье решение для тех, кто уже «сидит» на AD, и оно позволяет добавить нужный функционал в уже работающую систему с минимальными трудозатратам. Если же инфраструктура поднимается с нуля, то, конечно, возможны варианты.


                  1. gecube
                    06.09.2019 09:26

                    Почему Вы так считаете? Задача — оперативно узнать, за какой машиной сейчас работает пользователь, чтобы удаленно подключиться/выполнить диагностику. Сбор истории — это уже другая задача.

                    Потому что если у пользователя две активные сессии, то Вы об этом не узнаете.
                    Что хуже — если пользователь залогинился на компе А, потом на компе Б, а потом разлогинился на Б, но продолжил работу на А, то Вы об этом тем более не узнаете


                    1. AAT666
                      06.09.2019 09:44

                      Да, скрипты неплохо бы дописать чтобы в атрибуты машины тоже заносилась информация по вошедшему/вышедшему пользователю. У нас так сделано.


                    1. perlestius Автор
                      06.09.2019 09:50

                      Отслеживание таких гиперактивных пользователей — это уже другая задача. Решение, кстати, тоже есть, но оно выходит за рамки статьи. Возможно, опишу отдельно.
                      Но если у вас много таких людей, которые параллельно за несколькими машинами работают, возможно, имеет смысл подойти с другой стороны и пересмотреть процессы для них?


                      1. gecube
                        06.09.2019 10:01

                        Почему гиперактивных?


                        это уже другая задача.

                        И да, и нет.


                        Но если у вас много таких людей, которые параллельно за несколькими машинами работают, возможно, имеет смысл подойти с другой стороны и пересмотреть процессы для них?

                        Процессы чего, простите? Поддержки? Вам просто указали на недостаток Вашей системы — она в определенных случаях может давать недостоверные данные. Решение есть у коллеги ниже — самое правильное — https://habr.com/ru/post/463579/?reply_to=20592497#comment_20592363


          1. alex-khv
            06.09.2019 09:08

            "Еще раз спрошу: Вы пробовали это в продакшне делать в крупной или хотя бы средних размеров организации перед тем, как подобные советы давать?"


            Я делал несколько скриптов. Несколько тысяч пользователей. Больше сотни географически распределенных DC. Парсинг журналов DC. Раз в час параллельно парсились все журналы. В фильтре можно указать с какого времени читать файл. По id записи убиралось дублирование. Завели отдельную ВМ для этого. Запись в ms sql. Потом переделал на elastic search. Помимо этого ещё много чего собиралось с журналов. И не только с журналов безопасности. Например журналы direct access, rds gateway. Плюс раз в день опрос всех машин на список ПО. Все максимально параллезировалось. Пока хватит свободной памяти. Только через posh и wmi. И ещё много ещё чего. Брат жив.


            1. perlestius Автор
              06.09.2019 09:32

              Но согласитесь, такое такое решение требует больше ресурсов и времени (если оно не было внедрено ранее), когда конечная цель весьма скромная.


              1. gecube
                06.09.2019 10:03

                Мне кажется, что возможность отследить кто на какой машине является не основным эффектом этой системы, а побочным артефактом, хоть и довольно удобным. Зачем такое может понадобиться? Да для мониторинга тех же всплесков активностей хакеров по неуспешным security событиям. Такой вот недо-SoC.


      1. muon
        06.09.2019 11:06

        Вы пробовали парсить Security-логи, скажем, для организации, где тысяча пользователей и с десяток контроллеров домена
        ADAudit успешно парсит, а если деньги важнее времени, то Powershell по расписанию сделает то же.
        Но ламповой практической админской статье — лайк. Пользовался похожими скриптами на прошлой работе (было сделано до меня), только те скрипты писали не в AD, а в общую папку, что снимало проблему с перезаписью актуальных данных.


  1. T64_72
    06.09.2019 01:19

    Хорошая статья :) Как раз по этой теме сегодня на работе была заморочка.

    Разница в скриптах
    «n» — «ff» (logon — logoff)


    1. perlestius Автор
      06.09.2019 01:21

      А Вы наблюдательный. :)


      1. gecube
        06.09.2019 09:05
        +1

        А почему не сделать один скрипт, а logon/logoff вынести как параметр?


        1. perlestius Автор
          06.09.2019 09:41

          Мне показалось удобнее так. Но ничто не мешает сделать с параметрами. Как говорится, на вкус и цвет… все фломастеры разные


  1. szelga
    06.09.2019 07:00

    если 100500 машин и пользователей, то можно поставить какой-нибудь fusioinventory, который будет следить и за этим, и за многим другим.


  1. Andrusha
    06.09.2019 08:01
    +1

    Я в своё время делал подобное как раз с помощью упомянутого вами BgInfo — в нём, помимо вывода информации на рабочий стол, есть возможность при запуске заносить эту же информацию в файл на сетевой шаре или в базу данных.


  1. lATEuCTl
    06.09.2019 08:05

    Решили проблему с именами проще:
    Имя пк соответствует имени пользователя, а имя пользователя в виде ФамилияИО.
    Для совсем тяжёлых случаев распространяем групповой политикой rainmeter (отбражает инфу на рабочем столе, не затрагивая обои) с информацией «имя пк, имя пользователя, ip, домен, ОС и её разрядность».


    1. perlestius Автор
      06.09.2019 08:15

      ИМХО, называть ПК по имени пользователя — путь в никуда, если у вас много пользователей/ПК и большая текучка кадров. Замучаетесь переименовать и всё равно не уследите в итоге.

      Для совсем тяжёлых случаев…

      Тяжёлые — это какие, например?


      1. lATEuCTl
        06.09.2019 08:29

        ИМХО, называть ПК по имени пользователя — путь в никуда, если у вас много пользователей/ПК и большая текучка кадров. Замучаетесь переименовать и всё равно не уследите в итоге.

        В любом случае, с приходом нового пользователя, ПК нужно настроить. Переименование занимает не так много времени, зато соблюдается порядок.
        Тяжёлые — это какие, например?

        Когда имя ПК по какой-то причние не соответствует имени пользователя =) Обычно если одним ПК пользуются несколько человек, либо сотрудник, настраивающий ПК забыл\забил на преименование. Но ставим софтину всем пользователям — на всякий «тяжелый» случай.

        З.Ы. В домене примерно 1.5к ПК.


        1. gecube
          06.09.2019 09:06

          любом случае, с приходом нового пользователя, ПК нужно настроить.

          Не нужно. Перемещаемые профили? vdi? И пускай работает себе.


        1. fessmage
          07.09.2019 07:45

          Зачем настраивать ПК под нового пользователя? Софт стандартный, настройки почта и т.д. ярлыки — подтягиваются из политики при логине. Документы на общем сетевом диске, с правами доступа по группам AD и с авто монтированием той же политикой.
          И пусть пересаживаются хоть каждый день все.


          1. lATEuCTl
            07.09.2019 08:20

            Как раз-таки на компах довольно часто ставится специализированное программное обеспечение, которое может быть установлено не у всех сотрудников отдела, ЭЦП, средства от НСД и прочие прелести госслужбы.


            1. fessmage
              07.09.2019 09:03

              Ага, ну это уже специфика начинается, у меня таких было мало, в отдельных отделах, и да, там более индивидуальный подход уже.


      1. gecube
        06.09.2019 09:08

        ИМХО, называть ПК по имени пользователя — путь в никуда, если у вас много пользователей/ПК и большая текучка кадров.

        Т.е. чуть чаще, чем всегда ) полностью согласен. Имя компа должно содержать инвентарный номер (PC-12345678 подойдёт), может кодировать тип оборудования или его местоположение (PC-MSK-01-3000)


  1. TheStarOf
    06.09.2019 08:26

    Собирать онлогон скриптом через get запрос к своему собственному серверу с учётом вэйт нетворк полиси. А там сам себе Юи юикс делай. Хоть к телефонии прилепились и при звонке сразу открывается vnc например.


    1. Naves
      06.09.2019 10:44

      Кстати, кто-нибудь делал такую интеграцию телефонии и хелпдеска? Чтобы при поднятии трубки оператором техподдержки, запускался некий скрипт, который показывал нужную информацию.
      У меня все руки чешутся, наваять такой скрипт, который бы через asterisk AMI работал, но должно же быть уже что-то готовое.


      1. Renaissance
        06.09.2019 18:16

        У меня на работе подобное реализовано.
        При звонке в тех. поддержку автоматически открывается окно подключения по VNC к звонящему. Телефония, правда, не Asterisk.


  1. YMax
    06.09.2019 09:01

    Сделано всё проще:
    echo %date% %time% > \server\reports\users\%username%_%computername%.txt


    Пользователей 30 — 80. Способ далеко не лучший, но позволяет найти кто на каком компьютере вошел, в Radmin сделаны папки по отделам.


  1. paranoya_prod
    06.09.2019 09:34
    +1

    Хм.

    1. Настраиваем пересылку логов с рабочих станций на сервер. На сервере создаём новый вид (фильтр) журнала, в который будут попадать только эвенты логон и логофф. Профит.
    2. Либо на сервере-сборщике логов настраиваем скрипт отрабатывающий при возникновении событий логон/логофф, который пишет нужную нам информацию туда, куда нам надо.
    3. Либо всё тоже что и в предыдущем варианте, но скрипт отрабатывает на журнале безопасности рабочей станции и всё без сервера-сборщика.


    И да, разница в скриптах в предпоследней строке в слове: strTimeStamp & " <logon". И я бы сделал один скрипт но с параметром, так удобней его поддерживать в актуальном варианте, если надо что-то добавить или изменить.


    1. gecube
      06.09.2019 10:04

      И да, разница в скриптах в предпоследней строке в слове: strTimeStamp & " <logon". И я бы сделал один скрипт но с параметром, так удобней его поддерживать в актуальном варианте, если надо что-то добавить или изменить.

      Про это я тоже писал. Принципы DRY & KISS в полный рост.


      страиваем пересылку логов с рабочих станций на сервер. На сервере создаём новый вид (фильтр) журнала, в который будут попадать только эвенты логон и логофф. Профит.

      Тоже хороший вариант, спасибо за предложение.


  1. yurybx
    06.09.2019 09:41

    Узнаю имя компьютера по фамилии пользователя в корпоративном чате. У нас Miranda + Openfire. Клиент чата устанавливается автоматически, логинится по NTLM. Сотрудники разбиты на группы, в соответствии с названиями их отделов.


  1. Warlok9OOO
    06.09.2019 10:27

    Спасибо. Отличное, элегантное решение. Как раз сам собирался найти/сделать что-то подобное, чтобы работало и на старых ОС без powershell.
    1. Для удобства можно сделать формочку на PowerShell, куда вводишь фамилию(или часть) пользователя и она выводит список соответствующих пользователей/компьютеров. Тогда информация будет актуальнее.
    2. GPO. Как альтернатива, чтобы не использовать loopback. Применять к OU с пользователями, но в фильтрах безопасности указать Domain Users и группу в которую входят все рабочие станции(у нас в такую группу раз в сутки простенький скрипт добавляет все не серверные компьютеры).
    3. Из практики:
    а) Как писали выше. Когда-то использовал logon скрипт, создававший на шаре файл вида %username%_%computername%.txt. Для не очень больших компаний работающее решение
    б) bginfo. И сейчас используется на серверах.
    в) Когда работал в it-аутсорсинге, то была схема: на системный блок наклейка с номером техподдежки и id компьютера, взятый из CMDB. С нашей стороны в широко известной немецкой программе для удалённого доступа составлялся список компьютеров. Указывалось имя, пользователь компьютера и id. Поиск быстро позволял найти компьютер по одному из этих параметров, а заодно увидеть в сети компьютер или нет.


  1. andToxa
    06.09.2019 14:37

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


    • logon/logoff скрипты, пишущие в атрибуты в AD: используются в основном для поиска вторичной машины, где пользователь залогинен и это приносит какие-то проблемы
    • logon/logoff скрипты, пишущие в базу самописной интерактивной карты здания: решение не повсеместное, больше предназначенное для инженеров, решающих проблемы на месте, а не удаленно
    • самописное ПО в трее: повсеместное решение как раз для общения с первой линией поддержки. кроме простоты объяснения как получить информацию о пользователе/компьютере ("наведите мышку на красную иконку с надписью IT у часиков") позволяет пользователю самостоятельно создать обращение в ServiceDesk (с передачей технической информации)


  1. Renaissance
    06.09.2019 18:41

    Как реализовано у меня на работе:

    • DesktopInfo с IP-адресами в нижнем левом углу рабочего стола
    • Интеграция с IP-телефонией (при звонке в тех.поддержку автоматически открывается окно подключения по VNC)
    • logon-скрипт, отправляющий имя ПК в «базу»
    • самописный клиент — часть корпоративного прокси, в которой также доступен текущий/последний IP-адрес с коротким интервалом обновления
    • централизованный сбор журналов событий, где также видна история logon/logoff
    • система инвентаризации, с агентами (косвенно, но тоже иногда можно узнать «кто где»)

    Когда я начинал работать, из всего этого был только значок VNC в трее (и то не у всех) и клиент прокси, но в системе не было видно именно последнего IP-адреса, поэтому если клиент не запущен, то найти рабочий ПК острудника было весьма проблематично.


  1. andreysl
    06.09.2019 21:44

    Отличное решение из серии «Зачем просто, когда можно сложно»

    А в registry в HKEY_CLASSES_ROOT\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D} прописать %Username% on %Computername% пробовали?

    А за реализацию поставлю твёрдую пятёрку


    1. perlestius Автор
      06.09.2019 23:04

      А в registry в HKEY_CLASSES_ROOT\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D} прописать %Username% on %Computername% пробовали?

      «Чую, что дело бесовское, но обосновать не могу». Нет, не пробовал, колитесь, в чем гешефт!

      А за реализацию поставлю твёрдую пятёрку

      Смотрю, вам уже целых две поставили


    1. dmitrymaximov750546
      09.09.2019 14:29

      Так ведь в Windows 10 по умолчанию нет иконки «мой компьютер» на рабочем столе…


  1. EndUser
    07.09.2019 08:46

    шорткат Windows+Pause

    Windows-Break.
    Однажды имел лаптоп с разнесением Pause и Break, и таки да… Это не Pause.


    1. perlestius Автор
      07.09.2019 10:33

      Возможно, так оно и есть, но сейчас проверить не на чем. Текст поправил, спасибо.