无管理员权限用户如何通过PS1脚本以管理员身份启动程序/重启服务?
问题:无管理员权限下以管理员账号执行操作报错
场景与原脚本
尝试创建PowerShell脚本,在当前无管理员权限的用户环境下,以管理员账号启动记事本测试权限,但运行以下脚本时出现错误:
# Define el nombre del servicio, usuario y contraseña $ServiceName = "ApacheDtdlIdServer" $AdminUser = "User" $AdminPassword = "C0ntraseña" $startWithElevatedRights = "notepad" # Convierte la contraseña en un SecureString $SecurePassword = ConvertTo-SecureString $AdminPassword -AsPlainText -Force # Crea el objeto de credenciales $credentials = New-Object System.Management.Automation.PSCredential ($AdminUser, $SecurePassword) $ps = Start-Process -PassThru -FilePath powershell -Credential $credentials -ArgumentList '-noprofile -command &{Start-Process ', $startWithElevatedRights, ' -Wait -verb runas}' $ps.WaitForExit()
错误信息
Start-Process: This command cannot be executed due to the error: The directory name is invalid.
At C:\Users\IsaacSanzIT\Desktop\Rider\RestartScanner.ps1: 13 Character: 7
解决方案
一、修复启动记事本的脚本
原错误原因是-ArgumentList传递了多个独立字符串,导致PowerShell将命令拆分为无效参数。需将完整命令合并为单个字符串传递:
# 定义管理员账号信息 $AdminUser = "User" $AdminPassword = "C0ntraseña" $startWithElevatedRights = "notepad" # 转换密码为SecureString $SecurePassword = ConvertTo-SecureString $AdminPassword -AsPlainText -Force $credentials = New-Object System.Management.Automation.PSCredential ($AdminUser, $SecurePassword) # 构造完整命令字符串,避免参数拆分 $command = "-noprofile -command &{Start-Process '$startWithElevatedRights' -Wait -Verb RunAs}" $ps = Start-Process -PassThru -FilePath powershell -Credential $credentials -ArgumentList $command $ps.WaitForExit()
二、直接实现重启服务的操作(更高效)
无需绕开启动记事本,可直接以管理员身份执行服务重启命令,推荐两种方式:
方式1:使用sc.exe(兼容性更强)
# 定义服务名和管理员账号信息 $ServiceName = "ApacheDtdlIdServer" $AdminUser = "User" $AdminPassword = "C0ntraseña" # 转换密码为SecureString $SecurePassword = ConvertTo-SecureString $AdminPassword -AsPlainText -Force $credentials = New-Object System.Management.Automation.PSCredential ($AdminUser, $SecurePassword) # 执行服务停止+启动命令 $command = "-noprofile -command &{sc.exe stop '$ServiceName'; sc.exe start '$ServiceName'}" $ps = Start-Process -PassThru -FilePath powershell -Credential $credentials -ArgumentList $command $ps.WaitForExit()
方式2:使用PowerShell原生Restart-Service
# 定义服务名和管理员账号信息 $ServiceName = "ApacheDtdlIdServer" $AdminUser = "User" $AdminPassword = "C0ntraseña" # 转换密码为SecureString $SecurePassword = ConvertTo-SecureString $AdminPassword -AsPlainText -Force $credentials = New-Object System.Management.Automation.PSCredential ($AdminUser, $SecurePassword) # 直接重启服务 $command = "-noprofile -command &{Restart-Service -Name '$ServiceName' -Force}" $ps = Start-Process -PassThru -FilePath powershell -Credential $credentials -ArgumentList $command $ps.WaitForExit()
注意事项
- 确保
$AdminUser账号属于本地管理员组,且拥有操作目标服务的权限 - 明文存储密码存在安全风险,建议改用加密密码文件等安全方式传递凭证
- 若为域账号,需将
$AdminUser格式改为DOMAIN\User
内容的提问来源于stack exchange,提问作者Zenin0
相关产品推荐
相关产品推荐

