【问题标题】:Powershell (Version 2.0) remote execution of services with credentialsPowershell(2.0 版)使用凭据远程执行服务
【发布时间】:2013-09-05 10:37:53
【问题描述】:

我想使用 powershell 2.0 版(Windows Server 2008)在远程机器上启动/停止 apache 和 mysql 服务。我发现远程执行的语法如下:

(Get-WmiObject -Computer myCompName Win32_Service -Filter "Name='myServiceName'").InvokeMethod("Stop-Service",$null)

但我还必须为此执行提供凭据(DOMAIN_NAME\USERNANE 和 PASSWORD)。我是 powershell 新手,需要正确语法的帮助(示例将易于理解和实施)。

【问题讨论】:

    标签: powershell windows-server-2008 powershell-2.0


    【解决方案1】:

    Get-WMIObject 接受 -Credential 参数。您不应该在脚本中以纯文本形式保存凭据,因此您需要提示输入它们。

    $creds = get-credential;
    (Get-WmiObject -Computer myCompName Win32_Service -Filter "Name='myServiceName'" -credential $creds).InvokeMethod("Stop-Service",$null)
    

    如果您在远程系统上启用了 PSRemoting,则可以在没有 WMI 的情况下执行此操作。

    $creds = get-credential;
    Invoke-Command -computername myCompName -credential $creds -scriptblock {(get-service -name myServiceName).Stop()};
    

    基于 cmets 更新

    由于您将此作为计划作业运行,因此您根本不应该存储或提示输入凭据。将计划作业本身(通过计划任务)配置为在所需的用户帐户下运行,那么以下任一应该可以工作:

    # Your original code
    (Get-WmiObject -Computer myCompName Win32_Service -Filter "Name='myServiceName'").InvokeMethod("Stop-Service",$null)
    # If you have remoting enabled
    Invoke-Command -computername myCompName -scriptblock {(get-service -name myServiceName).Stop()};
    

    【讨论】:

    • 感谢您的快速回复。我想知道如何传递 DOMAIN_NAME\USERNANE 和 PASSWORD。因为我需要创建 shedule 任务,所以它不应该提示输入凭据。可能会将详细信息存储在 .txt 文件中。我不是 powershell 程序员,所以如果我遗漏了什么,请告诉我。
    • 您将其作为计划任务执行的事实应该在您的原始帖子中。您不应该将凭据存储在任何地方的纯文本中。配置计划任务以执行作为该用户。然后跳过我帖子中有关凭据的所有内容。
    • 我错过了运行选项,因为特定用户会在不存储密码的情况下帮助我。作为管理员,我可以通过 (get-service -ComputerName myCompName -Name myServiceName).Stop() 启动/停止服务。我会按照你的建议实现我的要求。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 2014-05-06
    • 2015-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多