【问题标题】:GetNamedSecurityInfo Intermittent failure with error=2GetNamedSecurityInfo 间歇性失败,错误=2
【发布时间】:2018-02-08 06:12:43
【问题描述】:

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

这几天我一直在碰壁,任何帮助都将不胜感激。

谢谢!

【问题讨论】:

  • 哦,我已经验证该服务可以访问 \\server\share\ 以及文件夹。并且该文件夹确实存在。调用大部分时间都很好,然后会失败,直到我重新启动服务。
  • \\server\share 与哪个登录会话 luid 关联?以及调用 GetNamedSecurityInfo 时您在令牌中拥有哪个 luid?
  • 服务在“NT Authority\System”下登录。 “共享”上的 NTFS ACL 具有拥有全部权限的每个人;并且共享所引用的 C:\ 上的底层目录也有一个 NTFS ACL,具有所有人/完全权限。
  • 不,你不明白。我询问登录会话 luid。 \\server\share 仅对某些登录会话可见。结果取决于令牌中的 luid。所以我问 - 这个共享是为哪个 luid 创建的?以及您的令牌中的哪个 luid?
  • @RbMm,UNC 路径应该适用于任何登录会话,不是吗?我认为如果登录会话不存在现有连接,则将创建一个连接,前提是令牌代表的用户有权访问共享。

标签: c++ windows acl impersonation ntfs


【解决方案1】:

事实证明,模拟令牌是如何损坏或无意中关闭的。 RevertToSelf 强制返回不知道 UNC 共享的本地系统,因此它准确地返回了 2。感谢您的帮助,我将关闭它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-18
    • 2011-10-21
    • 1970-01-01
    • 1970-01-01
    • 2022-01-19
    • 1970-01-01
    • 2017-04-19
    • 1970-01-01
    相关资源
    最近更新 更多