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 pm

Для ўхілення гэтых недахопаў было зроблена наступнае.

  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"

Калі супрацоўнікаў тэхпадтрымкі шмат, то можна раздаць ярлык з дапамогай ГПП.

Некалькі заўваг напрыканцы.

  • На машыне, адкуль запускаецца 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

Дадаць каментар