我曾尝试在以普通用户身份登录我的 Win10 Pro 21H1 系统时,以管理员权限运行 Process Explorer(以显示所有进程),这个任务看似简单,但结果比我预想的要困难。
我的情况如下:
- 我有几个普通用户帐户,假设其中一个叫约翰尼用户
- 我有一个管理员帐户,比如说约翰尼·管理员
我想要的是当我以以下身份登录时约翰尼用户,我想以管理员权限运行 Process Explorer。理想情况下,我希望无需任何手动干预,并避免 UAC 提示。
任务计划程序方法
首先,我想在任务计划程序中创建一个任务来执行此操作,类似于此处描述的内容:以管理员身份运行任务管理器(进程资源管理器)
但是,当我运行任务计划程序时约翰尼用户,我无法创建以最高权限运行的任务,提供约翰尼·管理员凭据。如果我尝试执行此操作,则会收到此错误(截屏):
Task Scheduler cannot create the task.
The user account is unknown, the password is incorrect,
or the user account does not have permission to create this task.
如果我使用以下方式运行任务计划程序约翰尼·管理员凭据,我可以毫无问题地创建任务。我使用以下选项:
- 条件“在 johny_user 登录时运行”
- 运行任务时,使用以下用户帐户:johny_admin
- 安全选项“用户登录时运行”
- 以最高权限运行-已勾选
当我以以下身份登录时约翰尼用户,Process Explorer 确实运行在约翰尼·管理员上下文,但没有 GUI,因此失去了运行它的目的。
PowerShell 方法
因此,我决定尝试使用 Powershell 脚本运行 Process Explorer,该脚本将在登录时由任务计划程序启动。我不想以纯文本形式提供密码,所以我选择了这个:
脚本1.ps1
$PassKey = get-content C:\scripts\passkey.txt
$Password = get-content C:\scripts\password.txt | Convertto-SecureString -Key $PassKey
$pp=New-Object -typename System.Management.Automation.PSCredential -argumentlist "MY-PC\johny_admin",$Password
$script = "c:\scripts\script2.ps1"
Start-Process powershell -Credential $pp -ArgumentList '-noprofile -command &{Start-Process $script -verb runas}'
和脚本2.ps1仅包含:
Start-Process "C:\Program Files\Process Explorer\procexp.exe" -ArgumentList "/t /p:h"
Script1.ps1 应该以提升的权限运行 script2.ps1。但是,尽管出现了一个新的 powershell 控制台,但脚本并未运行。
正在工作,但是...
到目前为止,我实现目标的唯一方法是使用 Nirsoft 的 AdvancedRun。但是,此软件的 cfg 文件需要具有johny_admin 的我用纯文本形式输入密码,我不喜欢这样。
所以
有人能建议我如何完成这个简单的任务吗?我不太关心是否使用任务计划程序、Powershell 或任何其他方法实现它。我只是想避免将管理员凭据以纯文本形式存储在某处。
编写 Powershell 脚本时对我有用的一些链接:
https://ss64.com/ps/syntax-elevate.html
https://social.technet.microsoft.com/Forums/office/en-US/132e170f-e3e8-4178-9454-e37bfccd39ea/startprocess-verb-runas-amp-credential?forum=winserverpowershell
https://stackoverflow.com/questions/55723583/how-to-launch-an-other-ps1-within-a-ps1-with-an-other-accompt-and-admin-rights
答案1
问题在于运行需要管理员提升权限的进程而没有以纯文本形式指定密码。
一个解决方案是使用如下实用程序
运行方式
您可以使用它来调用需要密码的程序。密码和所有其他详细信息都由 RunAsSpc 保存在加密数据库中。它可以执行runas
加密码加加密的操作(尽管用户可以是你自己)。
RunAsSpc 可免费供个人使用。有关使用它的更多详细信息,请参阅文章
使用 RunAsSpc 将密码传递给 Runas。
为了防止非高级用户使用,您可以在批处理文件周围添加对未定义环境变量的引用。这些变量在评估时显示为空,但它们会阻止读取批处理文件。
使用这个想法,以下脚本:
@echo off
echo "Hello, world!"
可能看起来像这样:
@%n%e%x%c%s%h%z%o%f% o%d%f%d%f
e%n%c%o%h%n%o %n%H%p%e%n%l%o%l%o%o%o%,%o% w%c%o%n%r%p%l%k%d%e%!%s%