如何禁用域中除内置管理员之外的所有管理员帐户?

如何禁用域中除内置管理员之外的所有管理员帐户?

假设某个域的管理员被解雇了,而您现在是 Windows 2012 服务器的新管理员。在管理网络时,系统提示您某些人正在使用具有管理权限的本地帐户登录计算机(他们可能从前任管理员那里获得了这些用户)。现在您要做的就是使用组策略禁用所有本地管理员,但内置管理员除外。

我曾尝试改变“允许本地登录”在:

Computer Configuration
 * Policies
   * Windows Settings
     * Security Settings
       * Local Policies
         * User Rights Assignment

但问题是,只有当您将“管理员组”添加到允许列表时,Windows 才允许您执行此操作,而这样做,我们将回到原点。

答案1

也许你问错了问题。与其试图禁用一堆不同计算机上的一堆本地用户帐户,不如使用组策略中的受限组来准确定义谁可以成为计算机上管理员组的成员。它将删除所有计算机上本地管理员组中的所有帐户,但你指定的帐户(或组)除外。

https://technet.microsoft.com/en-us/library/cc756802(v=ws.10).aspx

但是如果由于某种原因您实际上想将本地用户帐户保留在所有客户端上的本地管理员组中,但只是禁用它们,那么您将必须开发一个脚本来执行此操作。

编辑:因为这是一个懒散的周六下午,我编写了一个脚本来执行您所描述的操作。它会禁用所有属于管理员组的用户本地用户帐户除了对于内置管理员。这不是最有效的方法,但我懒得去优化它。再次声明,我的建议是使用组策略限制组,但我只是想编写一些脚本。

# Author: Ryan Ries
# This script disables all local user accounts who are members of the Administrators group,
# except for the built-in Administrator (sid-500).
# Use at your own risk.
Set-StrictMode -Version Latest

[Int]$DomainRole = (Get-WmiObject Win32_ComputerSystem).DomainRole

# Don't run if we are a domain controller.
If (($DomainRole -EQ 4) -OR ($DomainRole -EQ 5))
{
    Write-Error "This script cannot be run on a domain controller."
    Return
}

# We need to be an elevated administrator.
$CurrentUser = New-Object System.Security.Principal.WindowsPrincipal([System.Security.Principal.WindowsIdentity]::GetCurrent())

If (-Not($CurrentUser.IsInRole([System.Security.Principal.WindowsBuiltInRole]::Administrator)))
{
    Write-Error "$($CurrentUser.Identity.Name) is not currently an Administrator. (Need UAC elevation?)"
    Return
}

Add-Type -AssemblyName System.DirectoryServices.AccountManagement

$ContextType = [System.DirectoryServices.AccountManagement.ContextType]::Machine

$Context = New-Object System.DirectoryServices.AccountManagement.PrincipalContext -ArgumentList $ContextType, $Env:COMPUTERNAME

$IDType = [System.DirectoryServices.AccountManagement.IdentityType]::SamAccountName

$Group = [System.DirectoryServices.AccountManagement.GroupPrincipal]::FindByIdentity($Context, $IDType, 'Administrators')

Foreach ($Member In $Group.Members)
{
    If ($Member.Sid.Value.EndsWith('-500'))
    {
        # This is the built-in local administrator, so we'll skip it.
        Continue
    }

    $User = [ADSI]"WinNT://./$($Member.SamAccountName)"

    $User.UserFlags = 2

    $User.CommitChanges()

}

相关内容