我尝试使用CreateSymbolicLinkW()函数(来自Kernel32.dll)来创建符号链接。
在相应的计算机(Win7 Pro x64 SP1)上:
现在的情况是:
最后一个案例是实际问题。 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())
答案 0 :(得分:5)
您观察到的行为是由于UAC和默认情况下给予管理员用户的受限令牌。此令牌是通过使用普通管理员用户的令牌并过滤来自动创建的,以删除各种管理员权限。
通过在DOS提示符下运行命令whoami /priv
,您可以查看令牌具有的特权。从提升的提示中,您的令牌将具有比未提升的提示更大的权限集,包括创建符号链接权限。
不幸的是,我不相信有这种方法,因为这正是UAC的设计运作方式。我认为没有办法控制管理令牌的过滤方式,这是关键问题 - 除了完全禁用UAC之外。