【问题标题】:Powershell - Show ACTIVE users who are member of ADMINISTRATORS groupPowershell - 显示作为管理员组成员的 ACTIVE 用户
【发布时间】:2021-02-12 10:15:01
【问题描述】:

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

我不能用 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 }

【问题讨论】:

  • 我确实找到了一种让它在 DOS 中工作的方法,但是你必须键入“echo on”才能再次使用该窗口。如果你在单行的末尾加上“& echo on”,它会忽略开头的“@echo off”命令。我将在下一条评论中发布代码。有没有办法让回声正常运行?
  • @echo off & echo: & echo ^>^>^> 本地管理员(活动) ^nul ^| find /i "Account active" ^| find /i "Yes"') do (echo *** %i))

标签: powershell


【解决方案1】:

我认为这个 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-25
    • 1970-01-01
    相关资源
    最近更新 更多