在UAC下,为什么我不能将文件写为模拟用户?

时间:2009-04-25 18:11:00

标签: windows uac impersonation

我在启用UAC的Windows 2008之前冒充用户。我正在尝试将一些文件写入临时目录。但即使用户具有对目录的写访问权限,当我冒充该用户时,我也无法写入该目录(我收到了拒绝访问错误)。显然,这是因为UAC阻止了我。

这与微软论坛上的帖子有关:http://forums.iis.net/t/1149793.aspx但是除了微软员工反复提出同样的问题并且在得到他要求的信息时保持沉默,该论坛没有得到回应。

我已经能够通过在写入临时文件时没有冒充来解决这个问题,但我有几个问题:

  1. 为什么UAC在模仿时不允许写入文件?

  2. 我是否可以在模仿时放置临时文件?

  3. 有更好的解决方案吗?处理这个问题的“正确”方法是什么?

  4. 是否有关于UAC所有限制的文档来源?模仿用户?

4 个答案:

答案 0 :(得分:3)

除标准权限外,Vista还引入了完整性级别。应用程序运行的完整性级别可能低于写入位置/文件所需的级别。

Windows附带内置工具“cacls.exe”,但我建议使用http://www.minasi.com/apps/中的chml,这样可以更轻松地查看&编辑它们。有关详细信息,另请参阅http://msdn.microsoft.com/en-us/library/bb625964.aspx

答案 1 :(得分:1)

我的猜测是您正在写入%TEMP%中指定的临时目录或通过GetTempPath。这是一个进程范围的环境变量,因此它不尊重模拟。验证的一种快速方法是检查您要写入的路径,以查看它是否在模拟用户的配置文件下。

以下代码应该能够为模拟用户检索临时路径。

// Error checking removed for brevity.
// User profile must be loaded by this point,
// see LoadUserProfile/UnloadUserProfile
SHGetFolderPath(NULL, CSIDL_LOCAL_APPDATA, impersonationToken,
                SHGFP_TYPE_CURRENT,path);
StringCchCat(path, cchPath, "\Temp");

答案 2 :(得分:1)

我认为NuSkooler的回答可能是正确的。他链接到的文档(特别是this page)在讨论根文件夹时给出了以下内容:

  

通过设置具有高完整性级别的强制标签(适用于子对象,而不是子容器),根文件夹的默认安全性符合此策略。 以中等完整性级别运行程序的标准用户无法修改管理员在根文件夹中创建的文件,即使ACL授予用户修改访问权限。根文件夹具有高可靠性的可继承强制标签,即对象继承并且不会传播到子文件夹。

我不知道你的情况的具体情况,但这听起来像你遇到的一样 - 即使在ACL中有明确的允许条目,也无法写入文件夹。

您应该尝试使用Process Explorer和Process Monitor来查看究竟发生了什么,但它听起来确实可能是完整性级别。

另外,你应该运行icacls而不仅仅是cacls;这将显示ACL中的完整性级别。

答案 3 :(得分:0)

您应该尝试从msft处理监视器。此工具应该为您提供有关失败原因的更多信息。