Windows:找出谁登录


-哦,对我没有任何帮助,帮助!
-别担心,现在我们将修复所有问题。 计算机的名称是什么...
(从致电技术支持人员那里获取的典型流派)

好吧,如果您使用的是la BgInfo工具,或者您的用户知道Windows + Pause / Break快捷方式,并且知道如何单击它。 甚至有很少的实例设法了解他们的汽车名称。 但是,呼叫者除了主要问题外,还有第二个问题:找出计算机的名称/ IP地址。 而且解决第二个问题通常比第一个问题花费更多的时间(而您只需要更换墙纸或返回缺少的标签即可:)。
但是听到这样的声音会更好:
-Tatyana Sergeevna,不用担心,我已经在连接...


但这并不需要那么多。
技术支持专家只需记住机器的名称,并记住谁为之工作。
在描述我们现在使用的解决方案之前,我将简要考虑其他选择,以便完全批评它们以解释它们的选择。

  1. BgInfo桌面信息等。 如果有很多钱,也有付钱的。 最重要的是,技术信息显示在桌面上:机器名称,IP地址,登录名等。 在“桌面信息”中,您甚至可以将性能图剪切到一半的屏幕。
    例如,对于同一Bginfo,它不适合用户使用,用户需要最小化窗口以查看必要的数据。 当新文本显示在旧文本的顶部时,我和我的同事不止一次地在BgInfo中观察到一个特征工件
    管理员在桌面上张开的猫的脸上绘制出令人恐惧的192.168.0.123,破坏了背景图片的美感,这使某些用户感到恼火。
  2. 将标签标记为“我是谁”(请勿在结尾处添加问号:)。 桌面上的经典快捷方式,其后是一个简洁的脚本或不是很干净的脚本,它以对话框的形式显示必要的信息。 有时,脚本本身放置在桌面上,而不是快捷方式,恕我直言,这很不好。
    缺点是,如在第一种情况下那样,为了启动快捷方式,您需要最小化所有打开的窗口(命运的决定,在工作机器上打开一个带有单人纸牌的窗口,我们没有考虑)。 顺便说一句,您的用户是否知道在哪里戳以最小化所有窗口? 没错,用手指指着管理员的眼睛。

上限还暗示了上述两种方法的主要缺点在于,用户参与获取信息可能是盲目的,愚蠢的甚至是说谎的。
当每个人都知道在Windows上查看其计算机名称的位置时,我不会考虑提高计算机素养的选择:这是一项高尚的业务,但是非常困难。 如果公司有人员流动,那将是完全灾难性的。 我要说的是,在大多数情况下,他们不记得自己的登录信息。

他倾注了自己的灵魂,直到现在。
本文中的habrovchanin 手套的想法被作为基础。
这个想法的实质是,当用户登录Windows时,登录脚本将必要的信息(时间和计算机名称)输入到用户帐户的特定属性中。 退出系统后,它会执行类似的注销脚本。

我很喜欢这个主意,但在实施过程中没有解决任何问题。
  1. 将为用户编写登录和注销脚本的组策略应用于整个域,因此这些脚本可在用户登录的任何计算机上使用。 如果您将终端解决方案与工作站(例如Microsoft RDS或Citrix产品)一起使用,则此方法将很不方便。
  2. 数据输入到普通用户具有只读访问权限的用户帐户的“部门”属性中。 除了用户帐户属性外,脚本还更改了计算机帐户的“部门”属性,默认情况下,用户也无法更改。 因此,为使该解决方案有效,作者建议更改AD对象的默认安全设置。
  3. 日期格式取决于目标计算机上的本地化设置,因此从一台计算机上我们可以获取2018年11月10日14:53,而在另一台11/10/18 2:53 pm


为了解决这些缺点,进行了以下操作。
  1. GPO不会链接到域,而是链接到计算机的OU(我通过不同的OU将用户和计算机分开,并建议其他人)。 同时,将环回策略处理模式设置为合并模式。
  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脚本的计算机上,必须安装PowerShell的Active Directory模块(为此,足以在Windows组件中添加AD管理工具)。
  • 默认情况下,用户无法编辑其帐户的大多数属性。 如果您决定使用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 cmdlet连接到最近的域控制器)



图片来源

如果您通过以下简短调查,将不胜感激。

Source: https://habr.com/ru/post/zh-CN463579/


All Articles