确定 Windows 进程是否有权创建符号链接
我想以编程方式确定当前用户(或进程)是否有权创建符号链接。在 Windows(Vista 及更高版本)中,如果没有 SeCreateSymbolicLinkPrivilege,则无法创建符号链接,并且默认情况下,该权限仅分配给管理员。如果尝试在没有此权限的情况下创建符号链接,则会出现 Windows 错误 1314(客户端不持有所需的权限)。
为了演示此限制,我创建了 Windows 的全新安装,以初始管理员帐户登录(通过 UAC 限制),并且无法在主目录中创建符号链接。
运行命令提示符后作为管理员或禁用 UAC,该命令执行不会出错。
根据这篇文章,“每个进程代表用户执行的操作拥有[访问]令牌的副本”。
所以我创建了 一个 Python 脚本来查询权限。为了方便和后代,我在下面摘录了一段内容。
该脚本背后的想法是枚举所有权限并确定进程是否具有所需的权限。不幸的是,我发现当前进程实际上没有所需的权限,即使它可以创建符号链接。
我怀疑问题在于,即使当前用户的权限没有明确包含该权限,但他的组成员身份确实提供了该权限。
简而言之,我如何确定给定进程是否有权创建符号链接(而不尝试创建符号链接)?首选 C 或 C++ 或 Python 中的示例,但任何使用 Windows API 的示例都适用。
def get_process_token():
token = wintypes.HANDLE()
TOKEN_ALL_ACCESS = 0xf01ff
res = OpenProcessToken(GetCurrentProcess(), TOKEN_ALL_ACCESS, token)
if not res > 0: raise RuntimeError("Couldn't get process token")
return token
def get_privilege_information():
# first call with zero length to determine what size buffer we need
return_length = wintypes.DWORD()
params = [
get_process_token(),
TOKEN_INFORMATION_CLASS.TokenPrivileges,
None,
0,
return_length,
]
res = GetTokenInformation(*params)
# assume we now have the necessary length in return_length
buffer = ctypes.create_string_buffer(return_length.value)
params[2] = buffer
params[3] = return_length.value
res = GetTokenInformation(*params)
assert res > 0, "Error in second GetTokenInformation (%d)" % res
privileges = ctypes.cast(buffer, ctypes.POINTER(TOKEN_PRIVILEGES)).contents
return privileges
privileges = get_privilege_information()
print("found {0} privileges".format(privileges.count))
map(print, privileges)
I want to programmatically determine if the current user (or process) has access to create symbolic links. In Windows (Vista and greater), one cannot create a symbolic link without the SeCreateSymbolicLinkPrivilege and by default, this is only assigned to administrators. If one attempts to create a symbolic link without this privilege, a Windows error 1314 (A required privilege is not held by the client) occurs.
To demonstrate this restriction, I created a clean install of Windows, logged in as the initial Administrator account (restricted through UAC), and was unable to create a symlink in the home directory.
After running the Command Prompt as Administrator or disabling UAC, that command executes without error.
According to this article, "every process executed on behalf of the user has a copy of the [access] token".
So I've created a Python script to query for the permissions. For convenience and posterity, I include an excerpt below.
The idea behind the script is to enumerate all privileges and determine if the process has the required privilege. Unfortunately, I find that the current process does not in fact have the desired privilege, even when it can create symlinks.
I suspect the problem is that even though the current user's privileges does not explicitly include the privilege, his group membership does afford that privilege.
In short, how can I determine if a given process will have privilege to create symbolic links (without attempting to create one)? An example in C or C++ or Python is preferred, though anything utilizing the Windows API will be suitable.
def get_process_token():
token = wintypes.HANDLE()
TOKEN_ALL_ACCESS = 0xf01ff
res = OpenProcessToken(GetCurrentProcess(), TOKEN_ALL_ACCESS, token)
if not res > 0: raise RuntimeError("Couldn't get process token")
return token
def get_privilege_information():
# first call with zero length to determine what size buffer we need
return_length = wintypes.DWORD()
params = [
get_process_token(),
TOKEN_INFORMATION_CLASS.TokenPrivileges,
None,
0,
return_length,
]
res = GetTokenInformation(*params)
# assume we now have the necessary length in return_length
buffer = ctypes.create_string_buffer(return_length.value)
params[2] = buffer
params[3] = return_length.value
res = GetTokenInformation(*params)
assert res > 0, "Error in second GetTokenInformation (%d)" % res
privileges = ctypes.cast(buffer, ctypes.POINTER(TOKEN_PRIVILEGES)).contents
return privileges
privileges = get_privilege_information()
print("found {0} privileges".format(privileges.count))
map(print, privileges)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我找到了解决方案。以下 Python 代码是 Python 2.6 或 3.1 下的全功能脚本,演示了如何确定创建符号链接的权限。在管理员帐户下运行此命令会成功响应,在来宾帐户下运行此命令会失败。
请注意,脚本的前 3/4 大部分是 API 定义。这项新颖的工作从 get_process_token() 开始。
I found a solution. The following Python code is a fully-functional script under Python 2.6 or 3.1 that demonstrates how one might determine privilege to create symlinks. Running this under the Administrator account responds with success, and running it under the Guest account responds with failure.
Note, the first 3/4 of the script is mostly API definitions. The novel work begins with get_process_token().