<p>截至2017年,实现这一目标的简单方法如下:</p>
<pre><code>import ctypes, sys
def is_admin():
try:
return ctypes.windll.shell32.IsUserAnAdmin()
except:
return False
if is_admin():
# Code of your program here
else:
# Re-run the program with admin rights
ctypes.windll.shell32.ShellExecuteW(None, "runas", sys.executable, __file__, None, 1)
</code></pre>
<p>如果使用的是Python2.x,则应将最后一行替换为:</p>
<pre><code>ctypes.windll.shell32.ShellExecuteW(None, u"runas", unicode(sys.executable), unicode(__file__), None, 1)
</code></pre>
<p>还要注意,如果您将python脚本转换为可执行文件(使用诸如<code>py2exe</code>、<code>cx_freeze</code>、<code>pyinstaller</code>之类的工具),那么您应该替换空字符串(<code>""</code>)的第四个参数。</p>
<p>这里的一些优点是:</p>
<ul>
<li>不需要外部库(也不需要Python for Windows扩展)。它只使用标准库中的<code>ctypes</code>。</li>
<li>适用于Python2和Python3。</li>
<li>无需修改文件资源或创建清单文件。</li>
<li>如果不在If/else语句下面添加代码,代码就不会被执行两次。</li>
<li>如果用户拒绝UAC提示,您可以很容易地将其修改为具有特殊行为。</li>
<li>可以指定修改第四个参数的参数。</li>
<li>可以指定修改第六个参数的显示方法。</li>
</ul>
<p>底层ShellExecute调用的文档是<a href="https://msdn.microsoft.com/en-us/library/windows/desktop/bb762153%28v=vs.85%29.aspx?f=255&MSPPError=-2147217396" rel="noreferrer">here</a>。</p>