使用C#4.5,我正在使用此代码来启动Win32 API,以便在本地计算机上为AD域用户提供SeServiceLogonRight:
http://www.codeproject.com/Articles/4863/LSA-Functions-Privileges-and-Impersonation
long res = LsaAddAccountRights(policyHandle, sid, userRights, 1);
但是有一个不寻常的情况。代码在第一次运行时工作正常,我可以使用该帐户启动Windows服务。然后,出于测试目的,我从AD中删除该帐户。然后,我使用相同的帐户名重新创建帐户,然后再次运行代码。代码仍然成功运行并且没有出现错误,并且似乎向新用户授予SeServiceLogonRight,但是,当我尝试使用该用户帐户启动Windows服务时,我被告知用户未在此计算机上被授予SeServiceLogonRight
重新启动计算机可以解决问题,但我不想重新启动计算机以完成此过程。
答案 0 :(得分:3)
对于测试方案,您应该将LsaLookupCacheMaxSize
设置为0.有关您的问题(以及解决方案),请参阅KB946358:
LsaLookupCacheMaxSize注册表项设置可以在本地SID缓存中保存的最大缓存映射数。默认最大数量为128.当LsaLookupCacheMaxSize注册表项设置为0时,将禁用本地SID缓存。
行为是设计的。
我怀疑在AD中回收帐户后,您的测试会在后续运行中解决错误的SID。