我有一个脚本来显示最近未登录的用户,该脚本使用带有“LastLoginTimeStamp”过滤器的 Get -ADUser 命令。
目前,我们会禁用 90 天未登录的帐户,但我想更进一步(因为我们的许可证非常有限),以便未分配许可证的帐户在 30 天后被禁用。如果他们已经分配了许可证,那么在许可证到期之前禁用他们的帐户就没有什么意义了。
由于微软的政策规定“任何具有 RDP 能力的用户都必须拥有许可证”,我们发现有些用户没有使用 RDP,我们想禁用这些用户并将其移至不允许 RDP 的组,这样我们就可以为新用户释放许可证。
我在网上找到了多个资源,它们展示了如何生成 CSV 报告,但我找不到任何内容展示 PowerShell 如何访问此信息。有没有办法,或者我必须创建一个 Powershell 脚本来导出 CSV 许可证报告,然后再创建一个脚本来将该 CSV 的内容与 x 天内未登录的用户列表进行比较。
我并不是想找人为我编写脚本,而是想确认是否有办法在 Powershell 中执行此操作。
谢谢,
杰克。
答案1
在我处理过的大多数远程桌面/终端服务器许可情况下,这些信息都存储在 Active Directory 中的用户对象中。因此,获取这些信息的关键是了解正确的 LDAP 过滤器或要查询的属性。
我有一个基于 JScript 的报告,我运行该报告来提取这些信息,使用cscript.exe
,但原理在 Powershell 中应该是相同的。
在较旧的服务器/域(<=2003)中,此信息存储在单个属性中terminalServer
;而在较新的服务器/域(>2003)中,此信息分布在三个属性中(据我所知),称为msTSManagingLS
和msTSLicenseVersion
。msTSExpireDate
显然,随着信息量的增加,从较新的域中提取这些信息会更容易(但是,由于您正在使用 Powershell,所以这可能没问题)。
因此,假设 Powershell 和 AD 模块的版本支持脚本块样式的过滤器,则以下内容(虽然效率略低)应该可以让您接近:
Get-ADUser -Filter {(msTSManagingLS -like '*' -and msTSLicenseVersion -like '*') -or (terminalServer -like '*')} -Properties * | fl -Property Name,sAMAccountName,msTS*
如果您正在运行较旧的 Powershell 版本,则可能需要以更适合 LDAP 的方式制作过滤器。也许:
Get-ADUser -LDAPFilter '(|(&(msTSManagingLS=*)(msTSLicenseVersion=*))(terminalServer=*))' -Properties * | fl -Property Name,sAMAccountName,msTS*
一旦管道中有了相关的 AD 对象,就可以对它们调用常规 Powershell(例如Where-Object { $_.msTSExpireDate -lt [DateTime]::Today.AddDays(-30) } | Disable-Account
)
请注意,您需要执行还有更多工作比我上面所做的更能确保您不会禁用任何合理的帐户(尤其是因为这可能会导致您和/或其他管理员无法访问您自己的机器来解决问题)。至少,我会当然尝试将其限制为特定 OU 内的用户,例如通过对调用应用有效-SearchBase
和-SearchScope
参数Get-ADUser
,或者在过滤器中进行更多检查Where-Object
(例如使用Get-ADPrincipalGroupMembership
以确保他们不在域管理员团体)。
另请注意,这仅适用于运行具有远程桌面授权服务器的完整远程桌面服务的远程桌面服务器。您不能使用它来检查使用双连接管理员模式进行远程登录的用户。
答案2
由于没有人知道您的环境(例如,由于缺少这些信息,您真正使用的终端服务器是什么,它是如何配置的),因此很难提供适合此处的脚本。因此,您可能希望构建一个 powerhsell 脚本,该脚本使用 PerUserCALReport.vbs 生成的输出(请参阅这里&这里)。然后通过以下方式将此处生成的导出重新导入目录:导入-Csv。在这里使用 foreach 元素逐行检查,并使用 Get-ADUser 获取上次登录值。您可以在此处从组中删除/添加用户或禁用它。这取决于您。
请注意,LastLogon、LastLogonTimeStamp 和 LastLogonDate 之间存在差异这里。因此请使用适合您环境的那个,否则您的脚本将无法正常工作!