GetNamedSecurityInfo间歇性失败,错误= 2

时间:2017-08-30 13:35:25

标签: c++ windows acl impersonation ntfs

我有一个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);
        }

在这个问题上,我已经在墙上砸了好几天,非常感谢任何帮助。

谢谢!

1 个答案:

答案 0 :(得分:0)

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