6

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

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

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

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

  2. 有没有什么地方可以在模拟时放置临时文件?

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

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

4

5 回答 5

3

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

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

于 2009-07-03T03:26:54.610 回答
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");
于 2009-04-25T18:44:29.897 回答
1

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

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

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

您应该尝试使用 Process Explorer 和 Process Monitor 来查看到底发生了什么,但听起来肯定是完整性级别。

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

于 2010-08-29T01:36:04.417 回答
0

您应该尝试使用 msft 的进程监视器。该工具应该为您提供有关失败原因的更多信息。

于 2010-08-27T17:54:55.313 回答
0

我有类似的问题。我无法在远程文件夹中创建文件,例如"h:\MyRemoteFolder"。就我而言,问题是通过将路径更改为"\MyServer\MyUser$\temp\MyRemoteFolder"来解决的。您可以在文件资源管理器中查看此信息。似乎在模拟上下文中,一些 UAC 驱动器映射丢失了。

而不是:File.Create(@"h:\MyRemoteFolder\x.txt");

使用:File.Create(@"\\MyServer\MyUser$\MyRemoteFolder\x.txt");

于 2021-12-14T10:02:10.257 回答