win32api - 启用了UAC的符号链接创建问题?

时间:2015-03-15 17:35:32

标签: winapi symlink uac kernel32 mklink

我尝试使用CreateSymbolicLinkW()函数(来自Kernel32.dll)来创建符号链接。

在相应的计算机(Win7 Pro x64 SP1)上:

  • 启用UAC (=具有本地管理员权限的用户的进程是 默认情况下不提升)
  • 我已授予所有经过身份验证的用户"创建符号链接"用户权限的分配(通过计算机的组策略 - > Windows 设置 - >安全 - >本地政策 - >用户权利分配 - > 创建符号链接=经过身份验证的用户)
  • 启用了所有可能的符号链接评估类型(再次通过组策略设置)。 (确认" fsutil行为查询 SymlinkEvaluation"返回:"本地到本地符号链接是 启用。启用本地到远程符号链接。远程到本地 符号链接已启用。远程到远程符号链接 启用"

现在的情况是:

  • 当我在UNELEVATED进程中作为NON-ADMIN用户运行CreateSymbolicLinkW()时,它工作(创建符号链接)
  • 当我在ELEVATED进程中作为ADMIN用户运行CreateSymbolicLinkW()时,它工作(创建符号链接)
  • 当我在UNELEVATED(!)进程中将CreateSymbolicLinkW()作为ADMIN(!)用户运行时,它不起作用

最后一个案例是实际问题。 GetLastError返回的错误是: 1314(="客户端未保留所需的权限")

为什么在没有升级的进程中管理员用户失败,而它适用于未加载的shell中的任何非管理员用户?

我的代码旨在由任何类型的用户运行,最好是在一个非高效的流程中运行。要求管理员用户提升流程作为解决方法是我在任何情况下都要避免的。

同样的行为也可以使用Windows shell中的MKLINK命令重现 btw(非升级shell中的管理员用户失败,而非适用于所有非管理员用户)升高的壳)。

我非常感谢任何想法/建议。非常感谢提前!

编辑: 使用Python 2.7的示例代码:

import ctypes
CreateSymbolicLinkW = ctypes.WinDLL("Kernel32").CreateSymbolicLinkW
CreateSymbolicLinkW(u"c:\\linktest\\testlink.txt", u"c:\\linktest\\testtarget.txt",0)
print(ctypes.WinDLL("Kernel32").GetLastError())

1 个答案:

答案 0 :(得分:5)

您观察到的行为是由于UAC和默认情况下给予管理员用户的受限令牌。此令牌是通过使用普通管理员用户的令牌并过滤来自动创建的,以删除各种管理员权限。

通过在DOS提示符下运行命令whoami /priv,您可以查看令牌具有的特权。从提升的提示中,您的令牌将具有比未提升的提示更大的权限集,包括创建符号链接权限。

不幸的是,我不相信有这种方法,因为这正是UAC的设计运作方式。我认为没有办法控制管理令牌的过滤方式,这是关键问题 - 除了完全禁用UAC之外。