【发布时间】: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