【问题标题】:Running Powershell script using inline admin credentials to start and stop windows services使用内联管理员凭据运行 Powershell 脚本以启动和停止 Windows 服务
【发布时间】:2020-04-30 20:55:40
【问题描述】:

我以管理员身份访问计算机,我必须使用 Powershell 脚本启动、停止和重新启动一些窗口服务。我们不希望在运行脚本时出现 UAC 提示,因为只有一个用户可以访问该机器。同样由于某些特定要求,我们必须通过在其中添加管理员凭据来运行该脚本文件。

除了我迄今为止尝试过的其他解决方案外,与我正在寻找的解决方案相近的解决方案如下

$username = "Domain\user"
$password = ConvertTo-SecureString "myPassword" -AsPlainText -Force
$psCred = New-Object System.Management.Automation.PSCredential -ArgumentList ($username, $password)

Set-Service -Name Spooler -Status Running -PassThru -Credential $psCred

但我收到以下错误。

Set-Service : 找不到与参数名称匹配的参数 '凭据'。在行:6 字符:53 + ... t-Service -Name Spooler -Status Running -PassThru -Credential $psCred + ~~~~~~~~~~~ + CategoryInfo : InvalidArgument: (:) [Set-Service], ParameterBindingException + FullyQualifiedErrorId : NamedParameterNotFound,Microsoft.PowerShell.Commands.SetServiceCommand

更新 1(尝试建议)

Invoke-Command -credential $psCred -command {Set-Service -Name Spooler -Status Running -PassThru} -computername myComputerName

[myComputerName] 连接到远程服务器 myComputerName 失败 出现以下错误消息:客户端无法连接到 请求中指定的目的地。验证服务上的 目的地正在运行并正在接受请求。查阅日志和 WS-Management 服务的文档 目的地,最常见的是 IIS 或 WinRM。如果目的地是 WinRM服务,在目标上运行以下命令进行分析 并配置 WinRM 服务:“winrm quickconfig”。更多 有关信息,请参阅 about_Remote_Troubleshooting 帮助主题。 + CategoryInfo : OpenError: (myComputerName:String) [], PSRemotingTransportException + FullyQualifiedErrorId : 无法连接,PSSessionStateBroken

更新 2

我必须使用命令 Enable-PSRemoting -Force -SkipNetworkProfileCheck 在机器上启用 PSRemoting,以便 Invoke-Command 可以执行,但在重复命令 Invoke-Command -credential $psCred -command {Set-Service -Name Spooler -Status Running -PassThru} -computername localhost 后出现以下错误

[localhost] 连接到远程服务器 localhost 失败,原因是 以下错误消息:访问被拒绝。有关详细信息,请参阅 about_Remote_Troubleshooting 帮助主题。 + CategoryInfo : OpenError: (localhost:String) [], PSRemotingTransportException + FullyQualifiedErrorId : AccessDenied,PSSessionStateBroken

在提升的 powershell 窗口中运行相同的命令集工作正常。

考虑到我是 Powershell 世界的新手,请您指导我正确的方向。

【问题讨论】:

  • Set-Service 命令没有凭据参数。你可以使用Invoke-Command -credential $pscred -command {Set-Service -Name Spooler -Status Running -PassThru}
  • @LievenKeersmaekers,我尝试了您的建议,但没有奏效。搜索原因后,我发现“没有-computername 的-credential 不能存在”。请检查我的问题中的更新
  • 试试-computername localhost
  • @LievenKeersmaekers,我已经尝试了与您的建议相关的几个步骤,并在我的问题的 Update 2 中分享了调查结果。请看一下
  • 在这种情况下,您可以尝试运行 powershell,如this question

标签: powershell command-line


【解决方案1】:

在Set-Service的official documentation中提到

你可以这样试试吗?

$Cred = Get-Credential
$hostname = "$env:computername.$env:userdnsdomain"
Write-Host $hostname
Invoke-Command -ComputerName $hostname -Credential $Cred -ScriptBlock{ Start-Service -Name Spooler}

此外,如果您不想提示输入凭据,则可以将凭据存储在 Windows 凭据管理器中,然后从它们在 PowerShell 脚本中获取。请参阅this answer 以了解如何在 PowerShell 中使用凭据管理器

【讨论】:

  • 感谢 Kundan,但是在尝试以下脚本 $Cred = Get-Credential $S = Get-Service -Name Spooler Invoke-Command -ComputerName localhost -Credential $Cred -ScriptBlock { Set-Service -InputObject $S -Status Running } 时会抛出错误:[localhost] 连接到远程服务器 localhost 失败,并显示以下错误消息:访问被拒绝。有关详细信息,请参阅 about_Remote_Troubleshooting 帮助主题。 + CategoryInfo : OpenError: (localhost:String) [], PSRemotingTransportException + FullyQualifiedErrorId : AccessDenied,PSSessionStateBroken
  • 这意味着命令现在正常运行,但用户无权执行活动
  • 您可以使用$hostname = $env:COMPUTERNAME 获取当前机器名而不是使用localhost 并尝试相同的脚本吗?请参阅上面的更新脚本。
  • 在命令提示符下运行 sc stop Spooler 作为不同的用户给出 [SC] OpenService FAILED 5: Access is denied.
  • 试试这个。 Invoke-Command -ComputerName MachineName.domain -Credential domain\username -ScriptBlock{ Start-Service -Name Spooler}如果要停止它,请将其更改为 Stop-Service
猜你喜欢
  • 1970-01-01
  • 2018-03-13
  • 2014-04-07
  • 1970-01-01
  • 2019-09-16
  • 2019-07-30
  • 2020-06-27
  • 2019-09-26
相关资源
最近更新 更多