首页 > 解决方案 > Powershell - 显示作为管理员组成员的 ACTIVE 用户

问题描述

我有理由使用单行复制/粘贴脚本来显示属于管理员组成员的本地帐户,但前提是这些帐户处于活动状态。

我不能用 DOS 命令 net user 做到这一点,主要是因为 net localgroup 的输出不适合解析和所有回显到屏幕。(不过,这是此方法的单线)

echo: & echo ^>^>^> LOCAL ADMINS (Active) ^<^<^< & echo: & for /f "delims=" %i in ('net localgroup administrators') do (for /f "delims=" %j in ('net user "%i" 2^>nul ^| find /i "Account active" ^| find /i "Yes"') do (echo *** %i))

可以在 Powershell 中使用 Get-LocalGroupMember 和 Get-LocalUser 执行此操作。但是,这不适用于所有计算机(尤其是 Windows 7,或者由于未安装 cmdlet 而升级到 Windows 10 的计算机)。(虽然这是这种方法的单线)

Write-Host "`r`n'>>> LOCAL ADMINS (Active) <<<'`r`n"; Get-LocalGroupMember Administrators ^|% { Get-LocalUser ($_.Name).split('\')[1] ^|? Enabled ^|%  {Write-Host "'***'$($_.Name)"}}

我尝试使用 Get-WmiObject Win32_UserAccount 和 Win32_GroupUser 函数,无论 Windows 操作系统和年龄如何,它们似乎都可以工作,但这是我无法解决的问题。

我可以检索已启用用户的列表,但不知道如何测试管理员组的成员身份。这就是我目前所拥有的。

Get-WmiObject Win32_UserAccount ^|? {$_.Disabled -eq $false} ^|% { $_.Name }

标签: powershell

解决方案


我认为这个 PowerShell 脚本将在 Windows 7 工作站上完成这项工作:

# Retrieve NTDomain using Win32_ComputerSystem
$ComputerDomain = ((Get-WmiObject Win32_ComputerSystem).Domain).Split(".")[0]

# Retrieve members of Administrators group using Win32_Group.Domain
$Admins = Get-WmiObject -Query "SELECT PartComponent FROM Win32_GroupUser WHERE GroupComponent=`"Win32_Group.Domain='$ENV:Computername',Name='administrators'`""
$users = @()

# cut PartComponent format : \\PC001\root\cimv2:Win32_UserAccount.Domain="PC001",Name="Administrator"
foreach ($member in $Admins) {

    $partComponent = $member.PartComponent
    $namespace = $partComponent.Split(":")[0]
    $class = $partComponent.Split(":")[1].Split(".")[0]
    $memberDomain = $partComponent.Split(":")[1].Split(".")[1].Split(",")[0].Split("`"")[1]
    $memberName = $partComponent.Split(":")[1].Split(".")[1].Split(",")[1].Split("`"")[1]
    $users += $class + ":" + $memberDomain + "\" + $memberName
}

#Assemblies for domain accounts
Add-Type -assembly "System.DirectoryServices.AccountManagement"
Add-Type -assembly "System.Security.Principal"

$ActivesAdmins = @()

foreach ($user in $users) {

    $UserType = $User.Split(":")[0]
    $UserDomain = $user.Split(":")[1].Split("\")[0]
    $UserName = $user.Split("\")[1]

    #Domain accounts
    If (($UserType -eq "Win32_UserAccount") -and ($UserDomain -eq $ComputerDomain)) {
        $ActiveUser = $null
        $ActiveUser = New-Object System.Security.Principal.WindowsPrincipal("$UserName") -ErrorAction SilentlyContinue
        if ($activeUser -ne $null) {$ActivesAdmins += $UserDomain + "\" + $UserName}
    }
    #Local accounts
    ElseIf (($UserType -eq "Win32_UserAccount") -and ($UserDomain -eq $env:ComputerName)) {
        $DisabledUser = $null
        $DisabledUser = Get-WmiObject -Class Win32_UserAccount -Filter "LocalAccount=True" | Where-Object {$_.Name -eq "$UserName"} | ForEach-Object { $_.Disabled }
        If ($DisabledUser -eq $False) {$ActivesAdmins += $UserDomain + "\" + $UserName}
    }
}
Write-Host "List of Actives Admins :"
$ActivesAdmins

推荐阅读