C# lsaaddaccountrys()每次启动仅工作一次
使用C#4.5,我使用以下代码PInvoke Win32 API,以便在本地计算机上为AD域用户提供SeServiceLogonRight: 但是有一个不寻常的情况。代码在第一次运行时运行良好,我可以使用该帐户启动Windows服务。然后,出于测试目的,我从AD中删除了该帐户。然后用相同的帐户名重新创建该帐户,然后再次运行代码。代码仍然成功运行,没有出现错误,似乎授予新用户SeServiceLogonRight,但是,当我尝试使用该用户帐户启动Windows服务时,我被告知该用户尚未在此计算机上被授予SeServiceLogonRightC# lsaaddaccountrys()每次启动仅工作一次,c#,winapi,pinvoke,C#,Winapi,Pinvoke,使用C#4.5,我使用以下代码PInvoke Win32 API,以便在本地计算机上为AD域用户提供SeServiceLogonRight: 但是有一个不寻常的情况。代码在第一次运行时运行良好,我可以使用该帐户启动Windows服务。然后,出于测试目的,我从AD中删除了该帐户。然后用相同的帐户名重新创建该帐户,然后再次运行代码。代码仍然成功运行,没有出现错误,似乎授予新用户SeServiceLogonRight,但是,当我尝试使用该用户帐户启动Windows服务时,我被告知该用户尚未在此计算机
重新启动计算机可以解决此问题,但我不希望为了完成此过程而必须重新启动计算机。对于测试场景,您可能应该将
LsaLookupCacheMaxSize设置为0。有关与您的问题(以及解决方案)类似的问题,请参阅:
LsaLookupCacheMaxSize注册表项设置可以保存在本地SID缓存中的最大缓存映射数。默认最大值为128。当LsaLookupCacheMaxSize注册表项设置为0时,本地SID缓存将被禁用
这种行为是故意的。
在AD中回收帐户后,我怀疑您的测试在后续运行中解决了错误的SID。对于测试场景,您可能应该将LsaLookupCacheMaxSize
设置为0。有关与您的问题(以及解决方案)类似的问题,请参阅:
LsaLookupCacheMaxSize注册表项设置可以保存在本地SID缓存中的最大缓存映射数。默认最大值为128。当LsaLookupCacheMaxSize注册表项设置为0时,本地SID缓存将被禁用
这种行为是故意的。
我怀疑在AD中回收帐户后,您的测试在后续运行中解决了错误的SID。您是100%正确的。我禁用了LSA查找缓存,问题已经解决。很好,你完全正确。我禁用了LSA查找缓存,问题已经解决。那篇文章的翻译很差。C++在Windows上长为32位。C#长为64位。这篇文章的作者并不知道这一点。你需要仔细检查所有的翻译。FWIW那篇文章的翻译很差。C++在Windows上长为32位。C#长为64位。这篇文章的作者并不知道这一点。你需要仔细检查所有的翻译。
long res = LsaAddAccountRights(policyHandle, sid, userRights, 1);