使用PowerShell检测AD站点选项

如何使用PowerShell在PowerShell中查找AD站点选项,例如+IS_INTER_SITE_AUTO_TOPOLOGY_DISABLED ? 我一直在玩下面的命令,但不能让它吐出任何有用的东西。

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

编辑#3:更新参考文档。

编辑#2:再次编辑是因为我在PS中写了一些东西来完成你正在做的事情。 它在底部。

我打算继续说,目前没有Powershell Friendly (tm)方法。 但是,当然,如果您真的想要的话,您仍然可以使用Powershell来使LDAP查询成为查看这些选项所必需的。 查看与AD站点关联的每个服务器的“ NTDS Settings对象的options属性:

在这里输入图像描述

这是repadmin.exe工作的确切属性,这是一个位掩码。 Repadmin.exe在其代码中包含一个友好的位掩码翻译器。 就像ADSIEdit MMCpipe理单元一样。 但是,您需要在Powershell中重新创build该位掩码翻译器。

例如, Repadmin /options <DC> [{+|-} IS_GC]是一个有效的命令,现在我们知道它在哪个位上运行。

这里是options属性相对蹩脚的MSDN文档。

关于options属性的更好的MSDN文档。

选项属性

位字段,位的含义从objectClass到objectClass不等。 可以发生在站点间传输,NTDS连接,NTDS-DSA,NTDS站点设置和站点链接对象上。

以下是使用旧式匹配规则运算符search选项的示例 :

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

此筛选器使用LDAP_MATCHING_RULE_BIT_AND匹配规则运算符(1.2.840.113556.1.4.803)来查找在options属性的位掩码中设置了低位比特的nTDSDSA对象。 对应于Ntdsapi.h中定义的NTDSDSA_OPT_IS_GC常量的低位标识了全局编录服务器的nTDSDSA对象。 有关匹配规则的更多信息,请参阅searchfilter语法。

哦,男孩听起来很有趣!

一些其他的位掩码值:

在这里输入图像描述

所以,你应该有足够的信息来推出你自己的Get-ADSiteOptions Cmdlet …如果你想让我为你写一个我会收取非常适中的费用…)

编辑:这里是微软的链接, Repadmin专家 ,它详细说明了repadmin的optionssiteoptions子命令之间的区别:

通过使用siteoptions子命令,我们可以更改存储在NTDS站点设置对象上的选项属性。

至于那个位图? 它是甚至logging? 不确定。 如果你能告诉我什么是FORCE_KCC_WHISTLER_BEHAVIOR在面试中的意思,我会当场雇佣你。 你真是这样,MDMarra。 ;)

因此,总而言之,每个域控制器的CN=NTDS Settings对象的options属性对应于DC特定的选项,即repadmin <DC> /options ,而在CN=NTDS Site Settings对象下的options属性每个站点对应于repadmin /siteoptions

所以,最后回答你的问题。 获取特定的网站选项,而不是DC选项:

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

如果没有设置网站选项,Powershell将不会返回它们。 你或许可以简化上面的代码,但是这是使用你开始的说法。 经过太多的search后,我终于find了网站选项位掩码的文档:

网站选项位掩码

因此,对于作为示例给出的IS_INTER_SITE_AUTO_TOPOLOGY_DISABLED ,您需要为options属性查找值0x00000010

在这里输入图像描述

从运行Powershell片段:

与Powershell的网站选项


编辑#2:我今天给你写了一些东西:

 #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)} } } } } 

在这里它是在行动:

GET-ADSiteOptions

Ryan提到的文档省略了2个支持所有组合的必需的NTDSettings选项。 请在ntdsapi.hfind下面的值:

 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 } "@ 

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

可以简化

 SiteOptions=[nTDSSiteSettingsFlags]$SiteSettings.Options