Powershell和Python - 如何以管理员身份运行命令

5
我正在用Python编写一段代码,需要通过软件名称获取Internet流量。我需要使用CMD命令netstat -nb,但是这个命令需要提升权限。我需要保持代码简单,只有一行或者更少,不能使用长的批处理或PowerShell脚本。最好只使用Python的subprocess库。
我已经有了两行代码,可以解决我所需的一半问题:
subprocess.check_output('powershell Start-Process netstat -ArgumentList "-nb" -Verb "runAs"', stdout=subprocess.PIPE, shell=True)

这个问题的关键是一个新窗口被打开,导致我需要的所有数据都丢失了。也许有一种方法可以不打开另一个窗口或保存新窗口中的输出结果?

subprocess.check_output('powershell Invoke-Command {cmd.exe -ArgumentList "/c netstat -nb"}', stdout=subprocess.PIPE, shell=True)

这个例子中,我在同一窗口中输出结果,但是没有高程信息,因此我没有得到任何结果...也许有一种方法可以在不打开新窗口的情况下获取高程信息吗?

感谢您的帮助,希望我的问题足够清晰。


为什么你不直接调用那些命令,而要使用PowerShell呢? - Maximilian Burszley
2
为什么不让Python自己完成提升,而是让PowerShell为您完成呢?请查看此答案以获取有关此问题的详细信息: 这里 - TheMadTechnician
你看过RUNAS命令了吗? - lit
感谢您提供的所有答案。使用ExecuteShellW函数或其他同类函数,我无法保存来自cmd命令的输出,这就是为什么我需要使用子进程的原因。为了使用runas,我需要插入用户,然后输入密码,但我不会获得这些信息,即使我在我的计算机上使用它也无法正常工作。我需要做的是在我的Python脚本中静默运行(如果可能)netstat -nb命令,并将输出保存到变量中。如果一开始有什么不清楚的地方,请多多包涵。 - Pedro Peck
你是否以管理员身份运行你的Python脚本? - Caleb Seelhoff
我无法想象为什么您不会在除了提升权限之外的任何情况下运行管理脚本,但一个可能有效的方法(假设您无法在 Python 步骤中执行提升)是为 CMD /C netstat -nb 创建一个快捷方式,并将特权状态分配给该快捷方式。然后,您可以从程序中调用该快捷方式。这是第三种技术的变体,在 [https://www.bleepingcomputer.com/tutorials/windows-elevated-command-prompt/] 中提到。 - Steven K. Mariner
1个回答

1
创建一个批处理文件来执行任务,并将输出捕获到临时文件中。
[donetstat.bat]
netstat -nb > ".\donetstat.tmp"

然后在您的程序中执行那个
[yourprogram.py]
subprocess.check_output('powershell Start-Process cmd -ArgumentList "/c ".\donetstat.tmp" -Verb "runAs"', stdout=subprocess.PIPE, shell=True)

为了使临时文件更加防弹,最好获取TEMP环境变量并将其用于完全限定的临时文件位置:

netstat -nb > "%TEMP%.\donetstat.tmp"

然后在您的Python脚本中进行相同的操作。

一旦创建了临时文件,您就可以在Python中处理它。

如果需要多个工作进程持久化,添加一些代码以确保每个进程都有唯一的临时文件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接