我正在使用基于SASL的Python-LDAP(DIGEST-MD5)在Linux上将我们的AD与运行Python的Web服务集成以查询AD 2012用户属性(部门,部门,电话扩展,电子邮件等)。 在针对我的AD 2003的服务制定了特定的扭结之后,我开始遇到一个针对我们的新AD 2012的SPN错误,即digest-uri与服务器上的任何SPN都不匹配。 我交叉引用了两个服务器的SPN列表,它们包含相同的相似的类似物。
这是通过运行修复的:
setspn -A ldap/<Domain_Name> <Computer_Name>
请注意,即使运行以下命令,创build服务帐户也不能修复我的SPN错误:
setspn -A ldap/<Domain_Name> <Domain_Name>/<Service_Account_Name>
只有使用sasl_interactive_bind_s()将SPN添加到本地计算机SPN列表才能用于我的Python-LDAP服务。 我还应该注意,如果使用simple_bind_s(),则可以跳过SPN步骤,但是此方法以明文forms发送凭据,这是不可接受的。
但是我注意到,这个logging在消失之前只停留在SPN列表上一分钟左右? 当我运行setspn命令时,没有错误,事件日志完全是空的,没有重复的地方,使用基本dn上的-F森林范围的search进行检查,没有任何东西。 我已经添加并尝试重新添加和删除,并将SPN从对象移到对象,以validation它没有隐藏到任何地方,但第二次我将对象添加到任何地方,然后尝试重新添加它通知我的重复。 所以我非常有信心,没有重复隐藏的地方。
现在我已经有一个计划的任务重新运行命令,以保持在列表上的logging,所以我的服务将适当地命名为“SPN黑客”
cmd.exe /C "setspn -A ldap/<Domain_Name> <Computer_Name>"
直到我可以找出为什么SPN正在被清除。
我不是这个特定AD的主要pipe理员,pipe理员可以运行一个服务来同步AD上的另一个服务的SPN,而不知道它吗? 我的标题是Web Developer,而不是借口,而是解释我对Active Directory事务的无知。 我被告知要将AD作为主用户数据库,而且我一直在阅读很多内容,但是我无法find任何人在SPN被定期“覆盖”或“清理”时遇到问题的地方,pipe理员非常熟悉SQLServer条目之外的SPN。
到目前为止,我的黑客似乎没有为任何用户或服务造成任何问题,并没有产生任何错误,所以pipe理员说,他会让它运行,我会继续寻找。 但后来我发现自己处于编写一个服务的岌岌可危的境地,这个服务的实现基本上是一个cron hack / shiver …因此,任何帮助将不胜感激。
在与系统pipe理员对话之后,他同意在黑客之上build立一个服务并不是一个解决scheme,因此他允许我启动一个本地服务,并使用我可以用于我的目的的端点encryption,结果是一样的。 我会留意是什么导致SPN清除。 本地绑定不是使用Python-LDAP的问题,本地服务在一个小时左右就已经启动并运行了。 不幸的是,我基本上是将包含LDAP的function封装起来,但是我们只能做我们必须做的事情。
这是一个真正有趣(令人讨厌)的现象,我坚持要找出这里发生了什么事情。
幸运的是,Windows Server自2008年以来已经有了一些细粒度的审计策略,我们可以使用审计来追踪这是谁 。 为此,我们需要:
在域控制器上打开提升的命令提示符并发出以下命令:
repadmin /showobjmeta . "CN=computerAccount,DC=domain,DC=local"|findstr servicePricipalName
输出将包含最初编写servicePrincipalName属性值的当前版本的域控制器的名称: 
如果尚未定义全局审计策略,则可以对上一步中标识的域控制器上的本地安全策略进行此更改
打开组策略pipe理控制台( gpmc.msc )并findDefault Domain Controllers Policy并对其进行编辑。
Computer Configuration -> Windows Settings -> Security Settings Local Policies -> Security Options 
Advanced Audit Policy -> Audit Policies -> DS Access 
打开Active Directory用户和计算机( dsa.msc )并在“查看”菜单中选中“高级function”设置。
导航到计算机帐户对象,右键单击它并select“属性”。 select安全选项卡,并点击“高级”button。
在提示中,select“ 审核”选项卡,并确保正在审核“ 每个人 ”的“编写所有属性”。 如果不是,或者如果您有疑问,请添加一个新条目:
( 如果你懒惰,你可以select“写所有属性” )
从你的问题看来,SPN每分钟都会被删除,所以这可能是最简单的一步。 同时进行1分钟的音乐课 。
现在一分钟过去了,让我们来看一下步骤1中确定为始发者的域控制器上的安全日志。这对于大型域来说可能是一种痛苦,但是过滤可以帮助解决这个问题:
Windows Logs -> Security <All Event IDs> ”的input字段中,input5136 (这是目录对象修改的事件ID) 您现在应该能够为计算机帐户上的servicePrincipalName属性的每个更改find一个事件条目。
确定负责更改的“主题”,并查看其来源。 杀死那个进程/机器/账号!
如果主题被标识为SYSTEM , ANONYMOUS LOGON或类似的通用描述,那么我们正在处理域控制器本身的内部处理,我们需要打破一些NTDS诊断日志logging来了解发生了什么事情。 如果是这样,请更新问题