Windows: дізнаємося, хто де залогінен

Windows: дізнаємося, хто де залогінен
- Ой, у мене нічого не працює, допоможіть!
- Не хвилюйтеся, зараз все виправимо. Назвіть ім'я комп'ютера.
(класика жанру з дзвінків на техпідтримку)

Добре, якщо у вас є інструмент а-ля 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

Для усунення цих недоліків було зроблено таке.

  1. GPO лінкується не до домену, а до OU з машинами (я поділяю користувачів та машини за різними OU та іншими раджу). При цьому для loopback policy processing mode виставлено режим злиття.
  2. Скрипт заноситиме дані лише в обліковий запис користувача до атрибуту інформація, який користувач може змінювати самостійно для свого облікового запису.
  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 з потрібними налаштуваннями та лінкуємо його до підрозділу з робочими станціями користувачів:
    Windows: дізнаємося, хто де залогінен
  2. йдемо пити чай (якщо AD з великою кількістю користувачів, то чаю потрібно багато 🙂
  3. запуск PS-скрипт і отримуємо результат:
    Windows: дізнаємося, хто де залогінен
    У верхній частині вікна є зручний фільтр, в якому можна відбирати дані за значеннями одного або кількох полів. Клік по колонках таблиці сортує записи за значеннями відповідних полів.

Можна красиво "упакувати" наше рішення.
Windows: дізнаємося, хто де залогінен
Для цього додамо ярлик для запуску скрипту спеціалістам техпідтримки, який має в полі «об'єкт» щось таке:
powershell.exe -NoLogo -ExecutionPolicy Bypass -File "servershareScriptsGet-UsersByPCsInfo.ps1"

Якщо співробітників техпідтримки багато, то можна роздати ярлик за допомогою GPP.

Декілька зауважень наостанок.

  • На машині, звідки запускається PS-скрипт, має бути встановлений модуль Active Directory для PowerShell (для цього достатньо додати засоби адміністрування AD у компонентах Windows).
  • велику частину атрибутів свого облікового запису користувач за промовчанням редагувати не може. Враховуйте це, якщо вирішите використовувати атрибут, відмінний від інформація.
  • Поінформуйте всіх колег про те, який атрибут будете використовувати. Наприклад, той самий інформація використовується для інтерактивного додавання нотаток до скриньки користувача в адмінці 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 підключається до найближчого контролера домену)

Windows: дізнаємося, хто де залогінен

Джерело картинок

Буду вдячний, якщо ви пройдете коротке опитування нижче.

Тільки зареєстровані користувачі можуть брати участь в опитуванні. Увійдіть, будь ласка.

Чим користуєтесь?

  • bginfo, Desktop info, etc. (Безкоштовне ПЗ)

  • платні аналоги bginfo

  • зроблю так, як у статті

  • не актуально, т.к. використовую VDI/RDS, etc.

  • поки не використовую нічого, але замислююсь

  • мені не потрібно збирати такі дані

  • інше (поділіться в коментарях)

Проголосували 112 користувачів. Утрималися 39 користувачів.

Джерело: habr.com

Додати коментар або відгук