背景故事很简单:由于某些原因,一些服务器有 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