当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 如何获取计算机上的本地管理员列表?

作者:精品下载站 日期:2024-12-15 00:51:50 浏览:46 分类:玩电脑

如何获取计算机上的本地管理员列表?


在本文中,我们将了解如何获取对网络上的 Windows 工作站和服务器具有本地管理员权限的用户和组的列表。

在本地计算机上查找本地管理员

在 Windows 中,您可以使用计算机管理管理单元 (

compmgmt.msc

) 查看、添加或删除本地管理员组中的用户。展开计算机管理 -> 本地用户和组 -> 。然后选择管理员组。

默认情况下,当 Windows 计算机加入 Active Directory 域时,系统会向本地管理员用户和域管理员安全组授予管理员权限。

所有其他用户或组都单独添加到管理员组(手动、通过组策略、脚本等)。

[玩转系统] 如何获取计算机上的本地管理员列表?

您可以使用内置 Microsoft.PowerShell.LocalAccounts 模块中的 Get-LocalGroupMember cmdlet 来列出本地管理员组的成员:

Get-LocalGroupMember -Group "Administrators"

[玩转系统] 如何获取计算机上的本地管理员列表?

请注意,Principal 参数包含此用户/组的源,可以是本地、Active Directory 或 Azure AD 域。

您可以通过以下方式仅列出具有管理员权限的本地用户:

Get-LocalGroupMember Administrators | Where-Object { (Get-LocalUser $_.SID -ErrorAction SilentlyContinue).Enabled }

您可以过滤列表以仅包含 AD 用户:

Get-LocalGroupMember Administrators | Where-Object {$_.PrincipalSource -eq "ActiveDirectory"} | select PrincipalSource,class,name,SID

如果您的计算机上安装了 RSAT 包中的 Active Directory for Windows PowerShell 模块,您可以通过 AD 用户或组的 SID 获取有关 AD 用户或组的其他信息。

在此示例中,脚本查找此计算机上作为本地管理员的所有 Active Directory 组的成员(Get-ADGroupMember cmdlet 用于获取 AD 组用户的列表)。然后使用 Get-ADUser 来获取 SamAccountName 和帐户的状态

Enabled = True/False
$admins=Get-LocalGroupMember Administrators | Where-Object {$_.PrincipalSource -eq "ActiveDirectory"}
Foreach ($admin in $admins)
{
If ($admin.objectclass -eq "User") {get-aduser $admin.sid|select SamAccountName,enabled }
If ($admin.objectclass -eq "Group") {Get-ADGroupMember $admin.sid | foreach { Get-ADUser $_ |Select-Object SamAccountName,enabled }}
}

[玩转系统] 如何获取计算机上的本地管理员列表?

同样,您可以从 Active Directory 获取任何其他用户属性。

从远程计算机获取本地管理员组成员

上面的示例获取本地计算机上具有管理员权限的用户列表。现在让我们看看如何从远程 Windows 计算机获取本地管理员组的成员。

要在远程计算机上运行命令,您必须配置 PowerShell Remoting 并打开 TCP 5985 防火墙端口。您可以使用 GPO 启用和配置 WinRM (PSRemoting),然后更改 Windows Defender 防火墙组策略设置以打开其他端口。

使用 Invoke-Command PowerShell cmdlet 在远程计算机上运行命令。要列出名为 wsk-m2211 的远程计算机上的管理员,请使用以下命令:

Invoke-Command -ComputerName wsk-m2211 -ScriptBlock {Get-LocalGroupMember -Name 'Administrators'|select Name,ObjectClass,PrincipalSource|ft}

现在让我们看看如何从多台计算机获取管理员列表。为方便起见,我们将从结果中排除域管理员组:

$results = Invoke-Command wsk-m2211,srv-sql01,srv-rds02 -ScriptBlock {Get-LocalGroupMember -Name 'Administrators'|where {$_.name -notlike "*Domain Admins*"}|select Name,ObjectClass,PrincipalSource}
$results | Select-Object PSComputerName,Name,ObjectClass,PrincipalSource

[玩转系统] 如何获取计算机上的本地管理员列表?

您可以从结果中排除内置管理员或其他帐户。

使用 Export-CSV 命令将生成的用户和组列表导出到 CSV 文件:

$results | Export-CSV "C:\PS\admins.CSV" -NoTypeInformation -Encoding UTF8

您可以同时查询一个域中的多台计算机或服务器。在此示例中,我想要获取 AD 中所有 Windows Server 主机上的管理员列表。使用 Get-ADComputer cmdlet 列出 Active Directory 中启用的 Windows Server 计算机:

$computers = (Get-ADComputer -Filter 'operatingsystem -like "*Windows server*" -and enabled -eq "true"').Name

接下来,获取每个主机上的本地管理员组成员列表:

$results = Invoke-Command -ComputerName $computers -ScriptBlock {Get-LocalGroupMember -Name 'Administrators'|where {$_.name -notlike "*Domain Admins*"}|select Name,ObjectClass,PrincipalSource} -ErrorAction SilentlyContinue

从本地管理员组中删除用户

对于企业管理员来说,跟踪域计算机上本地管理员组的成员非常重要。主要思想是最大限度地减少具有本地管理员权限的用户数量。

建议您使用组策略首选项或受限组自动将用户添加到本地管理员组。这些 GPO 会自动将所需的用户添加到管理员组,并排除所有其他用户(手动添加)。

您可以使用以下命令手动从本地管理员组中删除用户:

Remove-LocalGroupMember -Group Administrators -Member username

您可以从远程计算机上的组中删除用户:

Invoke-Command -ComputerName wsk-m2211 -ScriptBlock {Remove-LocalGroupMember -Group Administrators -Member username}

但是,您可以使用一种更高级的方法。假设您已经创建了对计算机具有管理权限的用户列表,并将其保存在 $results 变量中。

$results = Invoke-Command wsk-m2211,wsk-m2233 -ScriptBlock {Get-LocalGroupMember -Name 'Administrators'|where {$_.name -notlike “*Domain Admins*”}|select Name,ObjectClass,PrincipalSource,SID}

然后以 Out-GridView 列表的形式显示用户和计算机的列表:

$principals_to_remove=$results | Out-GridView -Title "Select principal to remove from local admins" -OutputMode Multiple

接下来您要做的就是选择要从管理员组中删除的用户(按住CTRL以选择表中的多行)并运行代码:

foreach ($principal in $principals_to_remove)
{
Invoke-Command $principal.PSComputerName -ScriptBlock {Remove-LocalGroupMember -Group Administrators -Member $using:principal.name}
}

[玩转系统] 如何获取计算机上的本地管理员列表?

注意。这

$using:principal.name

构造允许您将本地变量值从计算机传递到远程 PSRemoting 会话。

这将从远程计算机上的本地管理员组中删除您选择的用户。

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯