我有一个C ++程序作为系统服务运行在  NT Authority \ System"。
程序有多个线程,每个线程偶尔会被唤醒并尝试加载指定路径的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 :(得分:0)
因此,事实证明,模仿令牌如何变得腐败或无意中被关闭。 RevertToSelf被迫回到本地系统,该系统不知道UNC共享,所以它准确地返回2.感谢您的帮助,我将关闭它。