Detectando opções do site AD usando o PowerShell

9

Como posso usar o PowerShell para encontrar opções de sites do AD, como +IS_INTER_SITE_AUTO_TOPOLOGY_DISABLEDno PowerShell? Venho brincando com o seguinte comando, mas não consigo cuspir nada útil.

Get-ADObject -Filter 'objectClass -eq "site"' -Searchbase (Get-ADRootDSE).ConfigurationNamingContext` -Properties options
MDMarra
fonte

Respostas:

17

Edit # 3: Atualizando a documentação de referência.

Edit # 2: Editando mais uma vez porque escrevi algo no PS para fazer exatamente o que você está tentando fazer. Está no fundo.

Vou seguir em frente e afirmar que não há como o Powershell Friendly (tm) fazer isso no momento. Mas é claro que você ainda pode usar o Powershell para tornar a consulta LDAP necessária para ver essas opções, se realmente quiser. Confira o optionsatributo do NTDS Settingsobjeto de cada servidor associado a um site do AD:

insira a descrição da imagem aqui

Esse é o atributo exato, que é uma máscara de bit, no qual repadmin.exe funciona. Repadmin.exe contém um amigável tradutor de máscaras de bits no seu código. Assim como o snap-in ADSIEdit MMC. No entanto, você precisará recriar esse tradutor de máscaras de bits no Powershell.

Por exemplo, Repadmin /options <DC> [{+|-} IS_GC]é um comando válido e agora sabemos exatamente em que parte ele opera.

Aqui está a documentação do MSDN relativamente ruim no optionsatributo.

Melhor documentação do MSDN no optionsatributo

Atributo de opções

Um campo de bits, onde o significado dos bits varia de objectClass para objectClass. Pode ocorrer nos objetos Transporte entre Sites, Conexão NTDS, NTDS-DSA, Configurações do Site NTDS e Link do Site.

E aqui está um exemplo de pesquisa de opções usando operadores de regras de correspondência da velha escola:

(&(objectCategory=nTDSDSA)(options:1.2.840.113556.1.4.803:=1))

Esse filtro usa o operador de regra correspondente LDAP_MATCHING_RULE_BIT_AND (1.2.840.113556.1.4.803) para localizar objetos nTDSDSA que tenham o bit de ordem inferior definido na máscara de bits do atributo options. O bit de ordem inferior, que corresponde à constante NTDSDSA_OPT_IS_GC definida em Ntdsapi.h, identifica o objeto nTDSDSA de um servidor Global Catalog. Para obter mais informações sobre regras de correspondência, consulte Sintaxe do filtro de pesquisa.

Oh garoto, isso parece divertido!

Alguns outros valores para a máscara de bits:

insira a descrição da imagem aqui

Portanto, com isso, você deve ter informações suficientes para lançar seu próprio Get-ADSiteOptionscmdlet ... se quiser que eu escreva um para você, eu o farei, por uma taxa muito modesta ...;)

Edit: Aqui está o link da Microsoft, Repadmin for Experts , que detalha a diferença entre os subcomandos optionse siteoptionsrepadmin:

Usando o subcomando siteoptions, poderíamos alterar o atributo options armazenado no Objeto de Configurações do Site NTDS.

Quanto a esse bitmap? Está documentado? Não tenho certeza. Se você pode me dizer o que FORCE_KCC_WHISTLER_BEHAVIORsignifica em uma entrevista, contratarei você imediatamente. Você é um grande show, MDMarra. ;)

Portanto, apenas para resumir, o optionsatributo no CN=NTDS Settingsobjeto para cada controlador de domínio corresponde às opções específicas do controlador de domínio, ou seja repadmin <DC> /options, enquanto o optionsatributo no CN=NTDS Site Settingsobjeto em cada site corresponde repadmin /siteoptions.

Então, para finalmente responder sua pergunta. Obtendo especificamente opções do site, não opções do DC:

ForEach($Site In (Get-ADObject -Filter 'objectClass -eq "site"' -Searchbase (Get-ADRootDSE).ConfigurationNamingContext)) 
{ 
    Get-ADObject "CN=NTDS Site Settings,$($Site.DistinguishedName)" -Properties Options 
}

Se não houver opções de site definidas, o Powershell não as retornará. Você provavelmente poderia simplificar um pouco o código acima, mas isso é usar a linguagem com a qual você começou. Depois de muita pesquisa, finalmente encontrei a documentação no bitmask de opções do site :

Opções de Site Bitmask

Portanto, IS_INTER_SITE_AUTO_TOPOLOGY_DISABLEDcomo exemplo, você procuraria um valor 0x00000010para o optionsatributo

insira a descrição da imagem aqui

E executando o snippet do Powershell:

Opções de site com o Powershell


Edit # 2: Escrevi algo para você hoje:

#Require -Version 3
#Require -Module ActiveDirectory
Function Get-ADSiteOptions
{
<#
.SYNOPSIS
    This Cmdlet gets Active Directory Site Options.
.DESCRIPTION
    This Cmdlet gets Active Directory Site Options.
    We can fill out the rest of this comment-based help later.
.LINK
    http://myotherpcisacloud.com
.NOTES
    Written by Ryan Ries, October 2013. [email protected].
#>
    [CmdletBinding()]
    Param()
    BEGIN
    {
        Set-StrictMode -Version Latest

        # This enum comes from NtDsAPI.h in the Windows SDK.
        # Also thanks to Jason Scott for pointing it out to me. http://serverfault.com/users/23067/jscott
        Add-Type -TypeDefinition @" 
                                   [System.Flags]
                                   public enum nTDSSiteSettingsFlags {
                                   NTDSSETTINGS_OPT_IS_AUTO_TOPOLOGY_DISABLED            = 0x00000001,
                                   NTDSSETTINGS_OPT_IS_TOPL_CLEANUP_DISABLED             = 0x00000002,
                                   NTDSSETTINGS_OPT_IS_TOPL_MIN_HOPS_DISABLED            = 0x00000004,
                                   NTDSSETTINGS_OPT_IS_TOPL_DETECT_STALE_DISABLED        = 0x00000008,
                                   NTDSSETTINGS_OPT_IS_INTER_SITE_AUTO_TOPOLOGY_DISABLED = 0x00000010,
                                   NTDSSETTINGS_OPT_IS_GROUP_CACHING_ENABLED             = 0x00000020,
                                   NTDSSETTINGS_OPT_FORCE_KCC_WHISTLER_BEHAVIOR          = 0x00000040,
                                   NTDSSETTINGS_OPT_FORCE_KCC_W2K_ELECTION               = 0x00000080,
                                   NTDSSETTINGS_OPT_IS_RAND_BH_SELECTION_DISABLED        = 0x00000100,
                                   NTDSSETTINGS_OPT_IS_SCHEDULE_HASHING_ENABLED          = 0x00000200,
                                   NTDSSETTINGS_OPT_IS_REDUNDANT_SERVER_TOPOLOGY_ENABLED = 0x00000400,
                                   NTDSSETTINGS_OPT_W2K3_IGNORE_SCHEDULES                = 0x00000800,
                                   NTDSSETTINGS_OPT_W2K3_BRIDGES_REQUIRED                = 0x00001000  }
"@
        ForEach($Site In (Get-ADObject -Filter 'objectClass -eq "site"' -Searchbase (Get-ADRootDSE).ConfigurationNamingContext)) 
        {            
            $SiteSettings = Get-ADObject "CN=NTDS Site Settings,$($Site.DistinguishedName)" -Properties Options
            If(!$SiteSettings.PSObject.Properties.Match('Options').Count -OR $SiteSettings.Options -EQ 0)
            {
                # I went with '(none)' here to give it a more classic repadmin.exe feel.
                # You could also go with $Null, or omit the property altogether for a more modern, Powershell feel.
                [PSCustomObject]@{SiteName=$Site.Name; DistinguishedName=$Site.DistinguishedName; SiteOptions='(none)'} 
            }
            Else
            {
                [PSCustomObject]@{SiteName=$Site.Name; DistinguishedName=$Site.DistinguishedName; SiteOptions=[Enum]::Parse('nTDSSiteSettingsFlags', $SiteSettings.Options)}
            }
        }
    }
}

E aqui está em ação:

Get-ADSiteOptions

Ryan Ries
fonte
Um post fantástico!
Simon Catlin
1
Whistler era o codinome para a era XP / 2003 dos sistemas operacionais. Suponho FORCE_KCC_WHISTLER_BEHAVIORque forçarei versões posteriores do KCC a usar apenas opções e algoritmos da era 2003. Quanto ao resto do seu post, achei que sim. Obrigado por confirmar.
MDMarra
4
Re: edit # 2 - Você quer se casar comigo?
precisa saber é o seguinte
É um bromance estrelado.
Ryan Ries
3

A documentação mencionada por Ryan omite 2 NTDSettings Options necessárias para oferecer suporte a todas as combinações. Encontre abaixo os valores encontrados em ntdsapi.h:

Add-Type -TypeDefinition @"
    [System.Flags]
    public enum nTDSSiteSettingsFlags {
    NTDSSETTINGS_OPT_IS_AUTO_TOPOLOGY_DISABLED = 0x00000001,
    NTDSSETTINGS_OPT_IS_TOPL_CLEANUP_DISABLED = 0x00000002,
    NTDSSETTINGS_OPT_IS_TOPL_MIN_HOPS_DISABLED = 0x00000004,
    NTDSSETTINGS_OPT_IS_TOPL_DETECT_STALE_DISABLED = 0x00000008,
    NTDSSETTINGS_OPT_IS_INTER_SITE_AUTO_TOPOLOGY_DISABLED = 0x00000010,
    NTDSSETTINGS_OPT_IS_GROUP_CACHING_ENABLED = 0x00000020,
    NTDSSETTINGS_OPT_FORCE_KCC_WHISTLER_BEHAVIOR = 0x00000040,
    NTDSSETTINGS_OPT_FORCE_KCC_W2K_ELECTIONn = 0x00000080,
    NTDSSETTINGS_OPT_IS_RAND_BH_SELECTION_DISABLED = 0x00000100,
    NTDSSETTINGS_OPT_IS_SCHEDULE_HASHING_ENABLED = 0x00000200,
    NTDSSETTINGS_OPT_IS_REDUNDANT_SERVER_TOPOLOGY_ENABLED = 0x00000400,
    NTDSSETTINGS_OPT_W2K3_IGNORE_SCHEDULES = 0x00000800,
    NTDSSETTINGS_OPT_W2K3_BRIDGES_REQUIRED = 0x00001000
    }
"@

E

SiteOptions=[Enum]::Parse('nTDSSiteSettingsFlags', $SiteSettings.Options)

pode ser simplificado por

SiteOptions=[nTDSSiteSettingsFlags]$SiteSettings.Options
Axel Limousin
fonte
Obrigado pela informação adicional. Eu o incorporei no meu script.
Ryan Ries