删除本地管理员

删除本地管理员

背景故事很简单:由于某些原因,一些服务器有 2 个本地管理员帐户...不知道,我接手了这项工作并清理了一切。

我需要经过 600 台(或更多)服务器来删除多余的帐户。

PowerShell 很棒,但无法解决这个问题。如何在 PowerShell 中修改和读取此位置?

我能读取到这里:HKLM:\SAM,但看不到 HKLM:\SAM\SAM...?如何让 PowerShell 编辑权限并读取此位置?

一旦我能看到这个位置,我就会想办法删除它 remove-item-somethingsomething

谢谢大家:)

答案1

我建议:

  • 首先获取所有 LocalAdmin 帐户的列表,
  • 没有内置管理员(其 SID 以 -500 结尾),
  • 使用以下(未经测试的)脚本,该脚本使用通配符表示可能本地化的组名
    (即德语中的 Administratoren)

## Q:\Test\2019\04\08\SO_961951.ps1

$scriptBlock = { Get-LocalGroup Admin* |
                  Get-LocalGroupMember | 
                   Where SID -notmatch '-500$' | 
                    Select-Object * }

$Servers = Get-ADComputer -Filter 'OperatingSystem -like "*windows*server*"' |
    Select-Object Name,OperatingSystem

$LocalAdmins = foreach($Server in $Servers){
    Invoke-Command -ComputerName $Server.Name -ScriptBlock $scriptBlock
}

$LocalAdmins | Export-Csv .\LocalAdmins.csv -NoTypeInformation

示例输出:

Name              SID                                            PrincipalSource ObjectClass
----              ---                                            --------------- -----------
Server\LotPings   S-1-5-21-1234567890-987654321-1234567890-1001            Local Benutzer

答案2

如果您有正确访问远程服务器的权限,则可以使用如下脚本:

$scriptBlock = 
{
Remove-LocalUser -Name UserToDelete
}
Invoke-Command -ComputerName RemoteServerName -ScriptBlock $scriptBlock

答案3

这是我做事的方式。

&"\\ServerExes\PavlesFolder\PsExec64.exe" \\$Computer -accepteula -nobanner -i -s cmd /c "echo . | powershell.exe (Remove-Item HKLM:\SAM\SAM\Domains\Account\Users\Names\$account -Force)"

它必须以“SYSTEM”身份运行,所以我使用 PsExec。当它从注册表中删除时,帐户仍显示在 compmgmt.msc 中,因此为了解决这个问题,我重新创建了用户并再次删除(使用 ADSI).. 它就消失了。

很乱,但是有用……

为完成工作而创建的函数:

Function Delete-Account-AsSystem {

    Param (
        [string]$Computer,
        [string]$Account
    )

    &"\\ServerExes\PavlesFolder\PsExec64.exe" \\$Computer -accepteula -nobanner -i -s cmd /c "echo . | powershell.exe (Remove-Item HKLM:\SAM\SAM\Domains\Account\Users\Names\$Account -Force)"

    If($LASTEXITCODE -eq 0){

        If(Get-WmiObject -Class win32_UserAccount -Filter "LocalAccount=True" -ComputerName $Computer | Where-Object {$_.Name -eq "Admin"} -eq $null){

            $temppassword = "P@ssword1!"
            $objOu = [ADSI]”WinNT://$Computer“

            $objUser = $objOU.Create("User", $Account)
            $objUser.SetPassword($temppassword)
            $objUser.SetInfo()

            $objOuDelete = [ADSI]”WinNT://$Computer“
            $objOuDelete.Delete("User",$Account)

            Write-Output "Deleted account."

        }#end if

    }Else{

        Write-Output "Didnt delete account."

    }#end if


}#end function


Delete-Account-AsSystem -Computer server01 -Account Admin

相关内容