Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# lsaaddaccountrys()每次启动仅工作一次_C#_Winapi_Pinvoke - Fatal编程技术网

C# lsaaddaccountrys()每次启动仅工作一次

C# lsaaddaccountrys()每次启动仅工作一次,c#,winapi,pinvoke,C#,Winapi,Pinvoke,使用C#4.5,我使用以下代码PInvoke Win32 API,以便在本地计算机上为AD域用户提供SeServiceLogonRight: 但是有一个不寻常的情况。代码在第一次运行时运行良好,我可以使用该帐户启动Windows服务。然后,出于测试目的,我从AD中删除了该帐户。然后用相同的帐户名重新创建该帐户,然后再次运行代码。代码仍然成功运行,没有出现错误,似乎授予新用户SeServiceLogonRight,但是,当我尝试使用该用户帐户启动Windows服务时,我被告知该用户尚未在此计算机

使用C#4.5,我使用以下代码PInvoke Win32 API,以便在本地计算机上为AD域用户提供SeServiceLogonRight:

但是有一个不寻常的情况。代码在第一次运行时运行良好,我可以使用该帐户启动Windows服务。然后,出于测试目的,我从AD中删除了该帐户。然后用相同的帐户名重新创建该帐户,然后再次运行代码。代码仍然成功运行,没有出现错误,似乎授予新用户SeServiceLogonRight,但是,当我尝试使用该用户帐户启动Windows服务时,我被告知该用户尚未在此计算机上被授予SeServiceLogonRight


重新启动计算机可以解决此问题,但我不希望为了完成此过程而必须重新启动计算机。

对于测试场景,您可能应该将
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);