2017-08-30 144 views
0

我有一个C++程序作为“NT Authority \ System”下的系统服务运行。GetNamedSecurityInfo间歇性故障,错误= 2

该程序有多个线程,每个线程偶尔会唤醒并尝试加载指定路径的ACL。我遇到的问题是,我零星地看到GetNamedSecurityInfo()调用失败,错误= 2,文件未找到。奇怪的是,这个调用会在相同的路径上成功一段时间,然后发生一些事情,然后调用就会失败。

我的代码看起来是这样的:

 SE_OBJECT_TYPE dwObjectType = SE_FILE_OBJECT; 
     LPTSTR szFile = _T("\\\\server\\share\\folder"); 
     DWORD dwError = ::GetNamedSecurityInfo(szFile, dwObjectType, DACL_SECURITY_INFORMATION | OWNER_SECURITY_INFORMATION | GROUP_SECURITY_INFORMATION, 0, 0, &pDacl, 0, (void**)&pSD); 
     if (dwError || !pDacl) 
     { 
      TRACE(_T("Error=%d\n"),dwError); 
      // try it again, maybe I was impersonating a different AD user by mistake. 
      ::RevertToSelf(); 
      dwError = ::GetNamedSecurityInfo(szFile, dwObjectType, DACL_SECURITY_INFORMATION | OWNER_SECURITY_INFORMATION | GROUP_SECURITY_INFORMATION, 0, 0, &pDacl, 0, (void**)&pSD); 
      TRACE(_T("Error=%d\n"),dwError); 
     } 

我一直在打我的头靠在墙上几天就这一个和任何帮助,将不胜感激。

谢谢!

+0

哦,并且我已验证该服务可以访问\\ server \ share \以及该文件夹。该文件夹确实存在。通话在大多数情况下都很有效,然后直到我重新启动服务时才会失败。 – WebDrive

+0

与哪个登录会话luid关联的'\\ server \ share'?并且当你调用GetNamedSecurityInfo *时,你有什么令牌? – RbMm

+0

服务在“NT Authority \ System”下登录。 “共享”上的NTFS ACL拥有拥有完整权限的所有人;并且共享引用的C:\上的基础目录也具有包含Everyone/Full权限的NTFS ACL。 – WebDrive

回答

0

所以事实证明,一些如何模仿令牌变得腐败或无意中关闭。 RevertToSelf被迫回到不知道UNC共享的本地系统,因此它准确返回2.感谢您的帮助,我会将其关闭。