65.9K
CodeProject 正在变化。 阅读更多。
Home

始终以管理员身份运行 Visual Studio, 无需 UAC 提示

starIconstarIconstarIconstarIconstarIcon

5.00/5 (35投票s)

2015 年 5 月 30 日

CPOL

7分钟阅读

viewsIcon

108891

更新:2015-07-30 - 在 Windows 10 RTM (10.0.10240) 上使用 VS2013 和 VS2015 正常工作 - 如果您正在运行 Windows 7、8、8.1 或 10 并且不想禁用用户账户控制 (UAC) - 您不应该这样做,而且在企业环境中可能也无法这样做 - 那么您会收到一个烦人的提示

更新:2015-07-30 - 在 Windows 10 RTM (10.0.10240) 上与 VS2013 和 VS2015 配合正常工作。

更新:2015-06-29 - 已将 Visual Studio 2015 版本添加到 GitHub 仓库 的 VS2015 文件夹中。

更新:2015-04-13 - 已更改为完全阻止命令窗口显示 - 您只需更新快捷方式以调用 .vbs 文件即可。

摘要

如果您正在运行 Windows 7、8、8.1 或 101 并且不想禁用 用户账户控制 (UAC) - 您 不应该这样做,而且在企业环境中可能也无法这样做 - 那么每次尝试以管理员身份运行任何程序时,您都会收到一个烦人的提示。

确保某个应用程序始终以提升的权限运行并且不会用 UAC 提示来烦您,这说起来容易做起来难。或者说,在此之前是这样的。

从这里下载修复程序:https://github.com/TomChantler/Always-Admin-VS,查看文件(永远不要只是随便安装从互联网上下载的东西),然后右键单击 install.bat 并选择以管理员身份运行来安装它。

注意:如果您有任何现有快捷方式,您需要手动更新它们,使它们指向 "%ProgramFiles(x86)%\TomSSL\VS2013.vbs"

虽然这个例子是专门用于运行 Visual Studio 的,但它也可以轻松地适用于其他应用程序。

背景

如果您经常使用 Visual Studio,那么您可能知道,如果您以管理员身份运行,它的效果最好,这最容易通过右键单击图标并选择该选项来完成。

Run as administrator

如果您像我一样,很可能您会一直忘记这样做,所以您可能会右键单击任务栏图标,然后选择属性 -> 快捷方式 -> 高级...并勾选以管理员身份运行

这效果很好,但您仍然会受到 UAC 提示的困扰。

Visual Studio UAC Prompt

更糟糕的是,如果您点击任何其他 Visual Studio 快捷方式 - 包括当您右键单击任务栏上的 Visual Studio 快捷方式时显示的解决方案快捷方式 - 它都不会以提升的权限运行。

此时您可以找到位于 %ProgramFiles(x86)%\Microsoft Visual Studio 12.0\Common7\IDE\devenv.exe 可执行文件,右键单击并选择疑难解答兼容性 -> 疑难解答程序 -> 此程序需要额外权限,这会相当好,因为它在点击任何快捷方式甚至 Windows 资源管理器中的 .sln 文件时都会起作用。

Don't Troubleshoot Compatibility

但是每次运行 Visual Studio 时,您仍然会收到烦人的 UAC 提示。

这看起来可能很荒谬,但快速搜索表明,在没有 UAC 提示的情况下以提升的权限运行程序的唯一方法是创建 Windows 计划任务并运行它。

我确实尝试过,先调用快捷方式,当快捷方式失败时,直接从计划任务运行可执行文件,但无法成功传递任何参数。我尝试了所有明显的方法,但就好像传递的参数在任务创建时就已硬编码。尝试了几次后,它抱怨找不到文件%1以及您可能预期的其他错误,我放弃了并继续前进。实际上,这意味着虽然我可以单独运行 Visual Studio,但我无法通过单击解决方案文件来运行它。

我想知道如果我从计划任务调用批处理文件而不是直接调用 .exe,参数(在我的情况下只是我想要打开的文件的路径)是否会被拾取,但得到了与我尝试直接调用 .exe 类似的结果。

此时我意识到我提出的任何解决方案可能都不会非常优雅。

接下来我决定尝试调用一个批处理文件,该文件将设置一个环境变量,然后调用一个计划任务,该任务将调用另一个批处理文件,该文件将读取环境变量,然后调用可执行文件,将参数传递过去。它没有成功。

最后,我找到了一个确实有效的方法。

解决方案

最终,我将一个批处理文件与应用程序关联起来。这个批处理文件将选定文件的路径写入磁盘。然后它调用一个计划任务,该任务调用另一个批处理文件,该文件读取文本文件,获取所需的文件,然后调用应用程序并将此作为参数传递。非常复杂,但它有效。更新 2015-04-13:我已使用 VBScript 包装了批处理文件调用,以防止命令窗口完全弹出。您可以在此处下载它。

它是如何工作的

四个六个值得注意的文件

install.bat

RunVisualStudioAsAdminNoUACPrompt.xml

VS2013.bat

VS2013.vbs

RunVS.bat

RunVS.vbs

让我们快速了解一下它们的作用。

install.bat

REM By Tom Chantler - https://tomssl.com/2015/03/31/always-run-visual-studio-as-administrator-with-no-uac-prompt/  
mkdir "%ProgramFiles(x86)%\TomSSL"  
mkdir "%ProgramData%\TomSSL"  
cd %~dp0  
copy RunVS.bat "%ProgramFiles(x86)%\TomSSL"  
copy RunVS.vbs "%ProgramFiles(x86)%\TomSSL"  
copy VS2013.bat "%ProgramFiles(x86)%\TomSSL"  
copy VS2013.vbs "%ProgramFiles(x86)%\TomSSL"  
schtasks /create /XML "RunVisualStudioAsAdminNoUACPrompt.xml" /TN "Run Visual Studio As Admin - no UAC Prompt"  
ftype VisualStudio.Launcher.sln="%SystemRoot%\System32\WScript.exe" "%ProgramFiles(x86)%\TomSSL\VS2013.vbs" "%%1" %%*  
ftype VisualStudio.sln.12.0="%SystemRoot%\System32\WScript.exe" "%ProgramFiles(x86)%\TomSSL\VS2013.vbs" "%%1" %%*  
pause

用于运行程序的批处理文件存储在 %ProgramFiles(x86)%\TomSSL 中,在我的机器上,它对应于 C:\Program Files (x86)\TomSSL

用于记住要打开哪个文件的临时文件存储在 %ProgramData%\TomSSL 中,对我来说,它类似地对应于 C:\ProgramData\TomSSL。在 Program Files 目录中存储处于不断变化状态的文件是不合适的,而且无论如何,在没有提升权限的情况下也无法编辑它们。我们不应该试图规避这一点,因此将临时文件存储在其他地方。

install.bat 创建这些目录,将批处理文件复制到其中,导入计划任务,然后更改文件关联。

ASSOC 和 FTYPE

如果您想知道哪些文件与哪些文件扩展名相关联,请打开命令提示符并输入类似以下内容

>assoc .sln
.sln=VisualStudio.Launcher.sln

这为您提供了此文件扩展名的关联

接下来,您可以通过以下方式查看将用于打开具有此关联(即具有此扩展名)的文件的程序


>ftype VisualStudio.Launcher.sln
VisualStudio.Launcher.sln="C:\Program Files (x86)\Common Files\Microsoft Shared\MSEnv\VSLauncher.exe" "%1"

我们将更改此设置。不要实际执行此部分;它已全部由安装文件处理。请注意 "%%1" 中的两个 % 符号;这不是拼写错误,我们需要在从批处理文件中调用函数时转义 %

ftype VisualStudio.Launcher.sln="%SystemRoot%\System32\WScript.exe" "%ProgramFiles(x86)%\TomSSL\VS2013.vbs" "%%1" %%*

当我在我的 Windows 7 机器上这样做时,一切正常。在我的 Windows 8.1 机器上,它不起作用。我通过添加这个额外的关联来修复它

ftype VisualStudio.sln.12.0="%SystemRoot%\System32\WScript.exe" "%ProgramFiles(x86)%\TomSSL\VS2013.vbs" "%%1" %%*

您会注意到我们指定应该使用 WScript.exe 来运行 .vbs 文件,尽管这应该不是必需的,因为 WScript.exe.vbs 文件之间已经存在关联。出于某种原因,我需要这样做才能让它在我的 Windows 8.1 机器上工作。

您可以结合使用 ASSOCFTYPE 以类似的方式分配其他文件类型。

RunVisualStudioAsAdminNoUACPrompt.xml

这是由 install.bat 导入的计划任务定义。MSDN 上有许多 带 XML 定义的计划任务示例

VS2013.bat

这个文件被调用而不是 Visual Studio。它决定您是否要加载文件,然后将此信息保存到 %ProgramData%\TomSSL\VSFileToOpen.txt 中的临时文件。该文件包含 NONE 或您要打开的文件的完整路径。接下来,它调用计划任务。

RunVS.bat

这由计划任务以提升的权限调用,但不会就此打扰您。它检查临时文件 VSFileToOpen.txt,然后调用 Visual Studio 可执行文件,并在适用时传入要打开的文件。

VS2013.vbsRunVS.vbs

这些是小型 VBScript 包装文件,它们在运行其关联的批处理文件时抑制命令窗口。更多信息请参见此处

Dim shell,command  
command = """%ProgramFiles(x86)%\TomSSL\RunVS.bat"""  
set shell = CreateObject("WScript.Shell")  
shell.Run command, 0

结论

在没有 UAC 提示或完全关闭 UAC 的情况下以提升的权限运行应用程序是困难的。您可能会想禁用 UAC,但您不应该这样做。上述方法是我找到的在所有情况下都能解决问题的唯一方法。它可能看起来不美观,但安装简单(在此获取代码,并记住之后更新任何现有快捷方式),它有效,并且不会损害您系统的整体安全性。

  1. 嗯,好吧,如果您有 UAC,您可能正在使用 Vista。但您不是,对吧?

© . All rights reserved.