【问题标题】:How to determine if elevated priveleges are required to start a process without checking-by-failure如何确定是否需要提升权限才能启动进程而不进行失败检查
【发布时间】:2011-11-10 11:20:04
【问题描述】:

如何检查是否需要特权提升才能启动子进程而不先尝试然后失败?

我需要从 python 代码中启动一个子进程命令。在某些情况下它可以正常工作,在其他情况下则需要提升权限;在某些 Windows 系统上,这种情况会导致我的程序冻结。

我想确定是否需要特权升级,而不尝试首先运行子进程并捕获/捕获任何错误情况。

导致程序冻结的进程被调用;

subprocess.call('路径_文件名_选项',shell=False)

【问题讨论】:

  • 不可能 100% 做到这一点。好的开始是阅读应用清单并检查 requireAdministrator。
  • 感谢提示,我会进一步调查:)
  • 检查失败有什么问题? EAFP 是 Python 的标准。
  • @Karl,是的,但是在我目前正在尝试解决的情况下,在失败的情况下,正在运行的程序会冻结并且当它尝试启动的子进程需要提升的权限时不会返回。程序正在尝试使用 subprocess.call('some path and filename and options',shell=False) 启动
  • 也许只是提升权限?如果用户已经是管理员,这不会造成问题,而且听起来,如果您并不总是需要升级,那么您无法提前确定是否需要它们...... o_O跨度>

标签: python windows escalation


【解决方案1】:

使用 pywin32,类似以下的内容应该可以工作...:

import pythoncom
import pywintypes
import win32api
from win32com.shell import shell

if shell.IsUserAnAdmin():
   ...

是的,看来 pywin32 确实支持 Python 3。

作者Alex Martelli

这也适用于没有 pywin32 的人。

import ctypes
print ctypes.windll.shell32.IsUserAnAdmin()

【讨论】:

  • 嗨,我确实看到了这个,但由于某些原因和其他原因,我无法在这种情况下使用 pywin32:/
  • 等一下,我认为你可以在 ctypes 中做同样的事情
  • 我也看到了。但它涉及使用 CreateProcess() 并检测这是否失败(如果我们从同一个 stackoverflow 问题和后续链接中读取;P)。我正在考虑至少尝试 ctypes 方法,因为它可能不会导致与我目前在某些情况下失败时相同的错误条件“​​冻结”。我以前没有以这种方式使用过 ctypes,所以我不知道它如何/是否会具有我目前看到的相同行为。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-09-28
  • 1970-01-01
  • 2016-12-16
  • 2020-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多