пятница, 19 октября 2012 г.

Отображение имени пользователя работающего на компьютере в сетевом окружении


В статье приведен пример скрипта позволяющего при просмотре компьютеров в сетевом окружении вывести в поле коментарий имя залогиненного на нем пользователя. Также в краце рассмотрено применение данного скрипта при помощи групповых политик и необходимые для этого условия.
Источник: NetworkDoc.Ru

Отображение имени пользователя работающего на компьютере в сетевом окружении.

Данная статья написана по материалам форума NetworkDoc.Ru. В качестве вступления, приведем выдержку из обсуждения:
"...Меня начальство озадачило, вот каким вопросом, как сделать так чтобы в сетевом окружении вместе с именем компьютера отображалось имя пользователя, который залогинился на этом компе. Для этого надо написать скрипт, а я в этому только учусь ..."
Далее рассматриваем практическую реализацию написание скрипта и применение на практике. В первую очередь мы должны получить имя пользователя, который входит на данный компьютер в сети, для этого определяем контекст пользователя в каталоге Active Directory основываясь на логине данного пользователя.
' Определяем контекст пользователя в АД
Set WSHNetwork = CreateObject("WScript.Network")
On Error Resume Next
Path = WSHNetwork.UserName
Set objSysInfo = CreateObject("ADSystemInfo")
strUserDN = objSysInfo.UserName
Set objUser = GetObject("LDAP://" & strUserDN)
Теперь получить имя пользователя уже не составляет труда. Для этого мы можем использовать несколько вариантов отображения имени:
  • Display Name - objUser.DisplayName
  • First name - objUser.givenName
  • Last Name - User.sn
Для отображения данных значений в комментариях компьютера, при просмотре его в сетевом окружении, нам необходимо добавить их в параметры службы Сервер (Server) задав значение переменной: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\lanmanserver\parameters\srvcomment.
Для применения изменений перезапускаем службу Lanmanserver.
' Остановка службы сервер для внесения данных о пользователе
 Set objWMIService = GetObject("winmgmts:")
 Set colSoftware = objWMIService.ExecQuery _
 ("Select * FROM Win32_Service WHERE Name ='Lanmanserver'" )
 For Each objSoftware in colSoftware
 objSoftware.StopService()
 Next
 
 ' Внесение данных о пользователе в свойcтва компьютера
 Set WSHShell = WScript.CreateObject("WScript.Shell")
 Set WshNetwork = CreateObject("WScript.Network")
 WSHShell.RegWrite "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\lanmanserver\¬
 parameters\srvcomment",  objUser.DisplayName
 
 ' Перезапуск службы сервер
 Set objWMIService = GetObject("winmgmts:")
 Set colSoftware = objWMIService.ExecQuery _
 ("Select * FROM Win32_Service WHERE Name ='Lanmanserver'" )
 For Each objSoftware in colSoftware
 objSoftware.StartService()
 Next
Важное замечание:
В действительности обычный пользователь не имеющих администраторских прав на локальном компьютере не может изменять значение переменных реестра в разделе HKEY_LOCAL_MACHINE, а так же не имеет прав на перезапуск службы сервер (server). Т.е. для работы скрипта необходимо наделить пользователя соответствующими правами, проще всего это сделать, создав отдельную групповую политику, используя которую мы дадим необходимые разрешения, а так же будем запускать данный скрипт при логине пользователя на компьютере.
Теперь соберем весь скрипт в единое целое.
' Определяем контекст пользователя в АД
Set WSHNetwork = CreateObject("WScript.Network")
On Error Resume Next
Path = WSHNetwork.UserName
Set objSysInfo = CreateObject("ADSystemInfo")
strUserDN = objSysInfo.UserName
Set objUser = GetObject("LDAP://" & strUserDN)

' Остановка службы сервер для внесения данных о пользователе
Set objWMIService = GetObject("winmgmts:")
Set colSoftware = objWMIService.ExecQuery _
("Select * FROM Win32_Service WHERE Name ='Lanmanserver'" )
For Each objSoftware in colSoftware
objSoftware.StopService()
Next

' Внесение данных о пользователе в свойcтва компьютера
Set WSHShell = WScript.CreateObject("WScript.Shell")
Set WshNetwork = CreateObject("WScript.Network")
WSHShell.RegWrite "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\lanmanserver\¬
 parameters\srvcomment",  objUser.DisplayName

' Перезапуск службы сервер
Set objWMIService = GetObject("winmgmts:")
Set colSoftware = objWMIService.ExecQuery _
("Select * FROM Win32_Service WHERE Name ='Lanmanserver'" )
For Each objSoftware in colSoftware
objSoftware.StartService()
Next
В конце данной статьи стоит предложить еще одну небольшую модификацию применения данного скрипта. Если пользователь, завершил свою работу на компьютере (logoff), то до того времени пока следующий пользователь не произведет вход в систему, в комментарии к компьютеру будет отображаться имя последнего пользователя последнего сеанса работы, что не совсем удобно,
Для того чтобы обойти эту ситуацию, добавим в групповую политику, которую мы используем для запуска скрипта еще одну небольшую процедуру, которая будет выполняться при выходе пользователя из системы.
' Остановка службы сервер для внесения данных о пользователе
Set objWMIService = GetObject("winmgmts:")
Set colSoftware = objWMIService.ExecQuery _
("Select * FROM Win32_Service WHERE Name ='Lanmanserver'" )
For Each objSoftware in colSoftware
objSoftware.StopService()
Next

' Внесение данных о пользователе в свойcтва компьютера
Set WSHShell = WScript.CreateObject("WScript.Shell")
Set WshNetwork = CreateObject("WScript.Network")
WSHShell.RegWrite "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\lanmanserver\¬
 parameters\srvcomment", ""

' Перезапуск службы сервер
Set objWMIService = GetObject("winmgmts:")
Set colSoftware = objWMIService.ExecQuery _
("Select * FROM Win32_Service WHERE Name ='Lanmanserver'" )
For Each objSoftware in colSoftware
objSoftware.StartService()
Next
Меняем параметр objUser.DisplayName на пустое значение "" теперь при выходе пользователя компьютер отображается просто по своему имени без комментария. Тем самым мы получаем дополнительную возможность видеть работает ли на нем в данный момент кто ни будь, или нет.
Обсуждая варианты применения скрипта возник еще один нюанс, предположим наши пользователи переодически работают используя термнал сервер. В этом случае при каждом логине пользователя на Терминал сервер будет выполнятся скрипт, но нам не нужно менять имена и коментарии серверов, поэтому мы попытаемся исключить их из зоны действия скрипта.
В процессе реализации алгаритма исключения, мы решили остановится на атрибутах сервера в АД. Отметим наши сервера введя в поле Discription в свойствах объекта сервер в АД его описание в нашем случае "Сервер". Можно так же использовать и другие поля атрибутов объекта в АД к примеру "Location".
Соберем скрипт заново отключив запуск его на серверах сети.
'Определяем значание поля Description (Описание) сервера 
Set WshNetwork = CreateObject("WScript.Network")
On Error Resume Next
Path = WSHNetwork.ComputerName
Set objSysInfo = CreateObject("ADSystemInfo")
strComputerDN = objSysInfo.ComputerName
Set objComputer = GetObject("LDAP://" & strComputerDN)

'Исходя из этого назначаем выполнение скрипта 
' В примере для серверов мы установили значение Description = "Сервер" 
Select Case objComputer.Get("Description")
  Case "Сервер"
' Скрипт не нужно выполнять, производим выход
Wscript.Quit  
  Case Else
'Скрипт нужен производим выполнение
' Определяем контекст пользователя в АД
Set WshNetwork = CreateObject("WScript.Network")
Path = WshNetwork.UserName
Set objSysInfo = CreateObject("ADSystemInfo")
strUserDN = objSysInfo.UserName
Set objUser = GetObject("LDAP://" & strUserDN)

' Остановка службы сервер для внесения данных о пользователе
Set objWMIService = GetObject("winmgmts:")
Set colSoftware = objWMIService.ExecQuery _
("Select * FROM Win32_Service WHERE Name ='Lanmanserver'" )
For Each objSoftware in colSoftware
objSoftware.StopService()
Next
' Внесение данных о пользователе в свойcтва компьютера
Set WshShell = Wscript.CreateObject("WScript.Shell")
Set WshNetwork = CreateObject("WScript.Network")
WshShell.RegWrite "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\lanmanserver ¬
\parameters\srvcomment",  objUser.DisplayName

' Перезапуск службы сервер
Set objWMIService = GetObject("winmgmts:")
Set colSoftware = objWMIService.ExecQuery _
("Select * FROM Win32_Service WHERE Name ='Lanmanserver'" )
For Each objSoftware in colSoftware
objSoftware.StartService()
Next
End Select
Теперь при логине пользователя скрипт будет выполнятся только на рабочих станциях сети и на тех серверах у которых данный атрибут не указан или имеет другое значение. Применение выборки исполнения скрипта в дальнейшем можно применить для установки, на отдельных серверах сети, при логине пользователя собственных процедур.
Обсудить данную статью и пременение скрипта можно на страницах форума перейдя по ссылке.

Комментариев нет:

Отправить комментарий