在我的个人 Win7 机器上,我的用户帐户是标准帐户,还有一个管理员帐户,我显然可以控制它。我使用 Windows 启动的一个应用程序需要管理员权限才能正常工作。如果有人好奇的话,它是 AIDA64 侧边栏。
我搜索了本网站、网络和 AIDA64 支持论坛,想找到让它工作的方法,但都没有找到好的方法。我已安排任务以管理员帐户启动,但在这种情况下,它甚至从未显示为标准用户正在运行(尽管如果标准用户“以管理员身份”手动启动它,那么它就可以正常工作)。或者,我可以为具有“最高权限”的标准用户安排它,我已经看到推荐了几十次,但这并不奏效,因为它只使用用户的最高可访问权限,而不是管理员的权限,即使管理员是安排任务的人!
我见过的最接近实际解决方案的方法是使用runas /savedcred
计划任务,但这是一个巨大的安全漏洞,没有人推荐。如果这是唯一的方法,我宁愿将我的用户帐户设为管理员并完成它。
我知道有很多安全选项我不知道或从未使用过。我希望有某种我尚未考虑过的方法来实现这一点。
答案1
有几种方法可以运行该应用程序
以管理员身份打开 CMD 并移动到存储应用程序的目录,然后尝试通过 cmd shell 启动应用程序
再次以管理员身份打开 cmd shell 并使用 PsExec 使用不同的管理员帐户启动应用程序,并查看处理器资源管理器是否在不同的会话中启动应用程序(我假设您将在您的机器上创建其他管理员用户)
尝试使用提升令牌启动应用程序执行命令 -h如果选项在管理员 cmd shell 中有效,则如果在 compmgmt.msc 中启用了该选项,则该应用程序还将从您机器的默认管理员帐户启动
使用相同的提升的 cmd shell 尝试在会话 0 中启动应用程序,看看它是否可以使用Psexec -s -i 0 应用程序并通过进程浏览器查看它是否确实启动了
您还可以尝试在系统帐户下的当前会话中启动该应用程序,看看它是否有效
您还可以使用 psexec 从管理员 shell 以用户权限启动应用程序 psexec -u 用户 -p 密码选项,看看它是否启动
还可以尝试使用 taskschedular 选项启动您的应用程序,最后您可以使用处理器资源管理器>选项>选择列>查看命令行来准确查看应用程序在管理员模式下启动时使用哪个命令启动,然后您可以使用相同的命令启动应用程序,通过这个您还可以调试为什么应用程序无法使用任务计划程序启动以及从处理器资源管理器中学习
答案2
该at /interactive
方法似乎是最佳的,但它只允许在特定时间安排任务。如果您想要一些复杂的启动条件,或者在用户登录时运行任务,则无法实现。我能够实现的最佳解决方案如下:
- 下载 PsTools:https://technet.microsoft.com/en-us/sysinternals/psexec.aspx,解压,将目录添加到 %PATH%,
创建批处理文件:
@echo off for /f "tokens=3 delims= " %%a in ('qwinsta ^| find /i "active"') do ( set SID=%%a ) PsExec.exe -i %SID% -h %*
如果您使用的是本地化的 Windows 版本(例如,在波兰语 Windows 中为“aktywna”),则可能需要将“active”替换为您的本地化术语。只需使用 进行检查即可
qwinsta
。此批处理文件确定活动会话的 SessionID,并使用当前用户的凭据运行命令,但在检测到的 SessionID 的会话中。以管理员身份运行任务计划程序并创建任务。将其设置为以提升的权限以管理员身份运行,与用户是否登录无关。设置运行任务所需的条件。设置操作以运行批处理文件,并将参数字符串设置为:
-d -u admin_user -p password yourApp.exe
如果您的应用程序是 CLI 应用程序,请省略
-d
。必须提供用于该任务的帐户的用户名和密码,否则 GUI 应用程序将无法正常工作(我不知道为什么;也许 CLI 应用程序可以正常工作,我没有检查过)。您可以提供开关,而不是提供用户名和密码,-s
但您的应用程序将使用本地系统帐户运行。
运行该任务的效果类似于右键单击可执行文件并选择“以管理员身份运行”,但没有弹出 UAC。这样,一旦您创建了批处理文件,您就可以轻松创建下一个任务,批处理将使它们在活动会话中运行。除非您的用户是可信任的,否则这种方式的安全性可能并不完美,但至少您的管理员密码不会以明文形式存储在批处理文件中,并且任务本身对普通用户不可见。为了使安全性更好一些,您可以使批处理文件和目标可执行文件对管理员以外的用户不可用。并且您需要确保没有人的登录名包含“active”或您本地 Windows 版本用来代替它的任何单词 - 否则您将不得不重新伪造批处理并添加另一个for
,这会使它变得复杂(或使用 PowerShell 或 UnxUtils)。