Windows:找出谁在哪里登录

Windows:找出谁在哪里登录
- 哦,对我来说没什么用,救命!
- 别担心,我们现在就会解决所有问题。 给你的电脑名称...
(从致电到技术支持的经典流派)

如果您有 BgInfo 之类的工具,或者您的用户了解 Windows+Pause/Break 快捷方式并知道如何按下它,那就太好了。 甚至有一些罕见的标本能够记住他们的汽车的名字。 但通常呼叫者除了主要问题外,还有第二个问题:找出计算机的名称/IP 地址。 通常,解决第二个问题比解决第一个问题需要更多的时间(并且您只需要更改壁纸或返回丢失的快捷方式:)。
但听到这样的事情要好得多:
- Tatyana Sergeevna,别担心,我已经在连接了......


为此你不需要太多。
技术支持专家只需记住机器的名称并记住谁为哪台机器工作。
在描述我们当前使用的解决方案之前,我将简要介绍一下其他选项,以便我可以彻底批评它们并解释我的选择。

  1. 背景信息, 桌面信息 等等。 如果钱多的话,就有付费的。 重点是桌面上显示技术信息:机器名称、IP地址、登录名等。 在“桌面信息”中,您甚至可以将性能图表压缩到一半屏幕上。
    我不喜欢的是,例如,对于同一个 Bginfo,用户需要最小化窗口才能看到必要的数据。 我和同事也在BgInfo观察过不止一次 特征伪影,当新文本显示在旧文本之上时。
    一些用户对管理员在桌面上伸展的猫脸上画了一个可怕的192.168.0.123感到恼火,破坏了背景图像的美观,当然,这非常令人沮丧,完全扼杀了工作精神。
  2. 一个“我是谁”的标签(不要试图在最后添加问号:)。 桌面上的经典快捷方式,其后面隐藏着一个整洁或不那么整洁的脚本,以对话框的形式显示必要的信息。 有时,他们不是将快捷方式放在桌面上,而是将脚本本身放在桌面上,恕我直言,这是不礼貌的行为。
    缺点是要启动快捷方式,就像第一种情况一样,您需要最小化所有打开的窗口(我们不考虑那些在工作计算机上打开唯一纸牌窗口的幸运儿)。 顺便问一下,您的用户知道在哪里单击以最小化所有窗口吗? 没错,一根手指插在了管理员的眼睛里。

该上限还表明,上述两种方法都具有主要缺点,即用户参与获取信息,可能是盲目的、愚蠢的,甚至是撒谎的。
当每个人都知道在 Windows 中的何处查找其计算机的名称时,我不会考虑提高计算机素养的选择:这是一项崇高的事业,但非常困难。 如果公司出现员工流失,那就完全是毁灭性的。 我能说什么,在大多数情况下,他们甚至不记得自己的登录信息。

我倾注了我的灵魂,现在进入正题。
以哈布罗夫居民的想法为基础 из 这篇文章.
这个想法的本质是,当用户登录Windows时,登录脚本将必要的信息(时间和机器名称)输入到用户帐户的某个属性中。 当您注销系统时,会执行类似的注销脚本。

我喜欢这个想法本身,但在实施过程中有些事情我不满意。

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

为了消除这些缺点,做了以下工作。

  1. GPO 不链接到域,而是链接到带有计算机的 OU(我将用户和计算机分为不同的 OU 并建议其他人)。 此外,对于 环回策略处理方式 模式已设置 合并.
  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 脚本:
获取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.

最后一些评论。

  • PowerShell 的 Active Directory 模块必须安装在启动 PS 脚本的计算机上(为此,只需在 Windows 组件中添加 AD 管理工具)。
  • 默认情况下,用户无法编辑其帐户的大部分属性。 如果您决定使用除 资料包.
  • 告知所有相关同事您将使用哪个属性。 例如,同样的 资料包 用于在 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

    来自站点 A 的 DC — 站点 A 的域控制器的名称(默认情况下,Get-AdUser cmdlet 连接到最近的域控制器)

Windows:找出谁在哪里登录

图片来源

如果您能参加下面的简短调查,我将不胜感激。

只有注册用户才能参与调查。 登录拜托

你用什么?

  • bginfo、桌面信息等。 (免费软件)

  • bginfo 的付费类似物

  • 我会按照文章中的方法做

  • 不相关,因为我使用VDI/RDS等。

  • 我还没有使用任何东西,但我正在考虑它

  • 我不需要收集此类数据

  • 其他(评论区分享)

112 位用户投票。 39 名用户弃权。

来源: habr.com

添加评论