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

Chr*_*ris 2 winapi symlink uac kernel32 mklink

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

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

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

现在的情况是:

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

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

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

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

使用Windows shell btw中的MKLINK命令也可以重现相同的行为(非升级shell中的admin用户失败,而非升级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())
Run Code Online (Sandbox Code Playgroud)

Jon*_*ter 5

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

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

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

  • @HarryJohnston:据我所知,非管理员用户没有获得拆分令牌,因此他们获得了分配给他们的权限.SeCreateSymbolicLinkPrivilege并没有什么特别之处; 如果用户已获得该权限,则他们将拥有该权限 - 对于管理员用户而言,令牌过滤是*删除*它.无论如何,那是我的理解. (2认同)