为什么 Python UAC 请求对其中包含空格的路径不起作用?
Why doesn't Python UAC Request work for paths with spaces in them?
我正在使用 ctypes.windll.shell32.ShellExecuteW
以便 运行 具有管理员权限的脚本。我不想使用 win32api
因为这是一个需要安装的包,而 ctypes
不需要。我已经意识到使用以下脚本(简化),如果脚本是 运行 在目录中有 space (例如 "C:\Users\User\Documents\My Folder"),即使 UAC 请求被授予,脚本不会获得管理员权限。只要脚本不在名称中带有 space 的目录中执行,它就可以正常工作。
脚本:
# Name of script is TryAdmin.py
import ctypes, sys, os
def is_admin():
try:
return ctypes.windll.shell32.IsUserAnAdmin()
except:
return False
if is_admin():
print("I'm an Admin!")
input()
else:
b=ctypes.windll.shell32.ShellExecuteW(None,'runas',sys.executable,os.getcwd()+'\TryAdmin.py',None,1)
if b==5: # The user denied UAC Elevation
# Explain to user that the program needs the elevation
print("""Why would you click "No"? I need you to click yes so that I can
have administrator privileges so that I can execute properly. Without admin
privileges, I don't work at all! Please try again.""")
input()
while b==5: # Request UAC elevation until user grants it
b=ctypes.windll.shell32.ShellExecuteW(None,'runas',sys.executable,os.getcwd()+'\TryAdmin.py',None,1)
if b!=5:
sys.exit()
# else
print('Try again!')
input()
else:
sys.exit()
这个问题 ShellExecute: Verb "runas" does not work for batch files with spaces in path 很相似,但在 C++ 中。
它很好地解释了您的问题的可能原因,与引用问题有关。
如果您引用论点(或至少是第二个论点),您应该解决问题。
b=ctypes.windll.shell32.ShellExecuteW(
None, 'runas',
'"' + sys.executable + '"',
'"' + os.getcwd() + '\TryAdmin.py' + '"',
None, 1)
我正在使用 ctypes.windll.shell32.ShellExecuteW
以便 运行 具有管理员权限的脚本。我不想使用 win32api
因为这是一个需要安装的包,而 ctypes
不需要。我已经意识到使用以下脚本(简化),如果脚本是 运行 在目录中有 space (例如 "C:\Users\User\Documents\My Folder"),即使 UAC 请求被授予,脚本不会获得管理员权限。只要脚本不在名称中带有 space 的目录中执行,它就可以正常工作。
脚本:
# Name of script is TryAdmin.py
import ctypes, sys, os
def is_admin():
try:
return ctypes.windll.shell32.IsUserAnAdmin()
except:
return False
if is_admin():
print("I'm an Admin!")
input()
else:
b=ctypes.windll.shell32.ShellExecuteW(None,'runas',sys.executable,os.getcwd()+'\TryAdmin.py',None,1)
if b==5: # The user denied UAC Elevation
# Explain to user that the program needs the elevation
print("""Why would you click "No"? I need you to click yes so that I can
have administrator privileges so that I can execute properly. Without admin
privileges, I don't work at all! Please try again.""")
input()
while b==5: # Request UAC elevation until user grants it
b=ctypes.windll.shell32.ShellExecuteW(None,'runas',sys.executable,os.getcwd()+'\TryAdmin.py',None,1)
if b!=5:
sys.exit()
# else
print('Try again!')
input()
else:
sys.exit()
这个问题 ShellExecute: Verb "runas" does not work for batch files with spaces in path 很相似,但在 C++ 中。
它很好地解释了您的问题的可能原因,与引用问题有关。
如果您引用论点(或至少是第二个论点),您应该解决问题。
b=ctypes.windll.shell32.ShellExecuteW(
None, 'runas',
'"' + sys.executable + '"',
'"' + os.getcwd() + '\TryAdmin.py' + '"',
None, 1)