【问题标题】:How do I 'run as' 'Network Service'?我如何“运行”“网络服务”?
【发布时间】:2023-03-07 04:51:01
【问题描述】:

我正在尝试以另一个帐户的身份运行一个进程。我有命令:

runas "/user:WIN-CLR8YU96CL5\network service" "abwsx1.exe"

但是这会要求输入密码。但是网络服务没有设置密码。

我正在尝试做的事情可能吗?

【问题讨论】:

    标签: command-line permissions runas network-service


    【解决方案1】:

    使用来自 SysInternals 的 PsExec.exe,从提升的命令提示符运行。

    例如这将打开一个作为 NETWORK SERVICE 运行的新命令提示符:

    psexec -i -u "nt authority\network service" cmd.exe 
    

    这将作为本地系统运行它:

    psexec -i -s cmd.exe 
    

    您可以通过在 cmd 提示符下运行 whoami 来验证这些。

    另见:

    【讨论】:

    • @stej - 不适合我。尝试从提升的命令提示符运行它,即以管理员身份运行命令提示符。
    • 不知道,psexec 版本是 2.11。我也在 winserver 2012 上尝试过,从提升的控制台作为 Azure 云服务运行,但它仍然要求输入密码。
    • 我也要密码。
    • 这似乎不适用于 64 位机器。一种解决方法是改用devxexec,它确实有效。
    • @Rory:我想我明白了。对于网络服务(至少在 Azure 角色中),您似乎必须指定 cmd.exe 的完整路径。由于某种原因,它没有默认的 PATH 变量或其他东西......
    【解决方案2】:

    在任务计划程序中,创建一个任务以在 NETWORK SERVICE 用户下运行应用程序。 然后,您可以使用

    从命令行运行任务 schtasks /run /TN "任务名"

    其中 taskname 是您的任务的名称。

    【讨论】:

    • 如何使用nt authority\localservice创建这个任务?
    • 是否可以将 mmc.exe 作为本地服务运行?
    【解决方案3】:

    您通常只能从 Windows 服务冒充为服务帐户,例如 this post 提及:

    诀窍是将您的代码作为本地系统运行,然后您可以使用适当的用户名来模拟服务帐户,而无需密码。以本地系统帐户运行代码的一种方法是使用下面显示的技术(取自 orginal post)创建命令行 shell,然后从那里执行程序集。在代码中调用System.Diagnostics.Debugger.Break() 可以进行调试。

    要创建在本地系统帐户下运行的命令行 shell,请打开一个新的命令行窗口并输入:

    c:\sc create testsvc binpath= "cmd /K start" type= own type= interact
    

    接着是:

    c:\sc start testsvc
    

    应该会打开一个新的命令窗口。在该窗口中运行您的 application.exe - 您会看到您现在以内置系统用户帐户的身份运行。完成测试后,您可以通过输入以下命令删除您创建的测试服务:

    c:\sc delete testsvc
    

    如果您尝试在自己的用户上下文中执行此操作,那么此类尝试应该会失败。

    【讨论】:

      【解决方案4】:

      我已经测试过了

      PsExec -i -s cmd.exe
      

      PsExec -i -u "nt authority\network service" cmd.exe
      

      在 PsExec64-v2.2 上,对于 win10-home-x64-10.0.14393 和 win10-pro-x64-10.0.15063 使用普通控制台失败,使用提升控制台它工作正常

      【讨论】:

      • 这种方法可以使用“whoami”命令确认,该命令在 cmd.exe 和 Powershell.exe 中都有效。
      【解决方案5】:

      我知道这是一个旧线程,但它是解决此问题的最佳结果,我希望能够使用 PowerShell 运行命令,而无需在我们的 Windows Server 上安装任何其他工具。我想出了以下 PowerShell 脚本,它创建一个计划任务,运行它,然后删除它。它还被编写为允许您在不同的用户帐户下运行命令。

      function InstallDotNetCoreGlobalTool($PackageId, $Action = "install", $User = "NT AUTHORITY\NETWORK SERVICE", $Password = "")
      {
          $TaskName = "AzureDotNetCoreGlobalToolConfiguration"
          $Command = "dotnet.exe"
          $Arguments = "tool $Action -g " + $PackageId
          $TaskAction = New-ScheduledTaskAction -Execute $Command -Argument $Arguments
      
          Write-Host "Setting up scheduled task to run" $Command $Arguments
      
          Register-ScheduledTask -TaskName $TaskName -User $User -Action $TaskAction
          Start-ScheduledTask -TaskName $TaskName
      
          Write-Host ""
          Write-Host "Waiting on scheduled task to complete."
      
          while ((Get-ScheduledTask -TaskName $TaskName).State  -ne 'Ready') 
          {
            # keep waiting
          }
      
          Write-Host ""
      
          If((Get-ScheduledTask $TaskName | Get-ScheduledTaskInfo).LastTaskResult -eq 0)
          {
              Write-Host $PackageId $Action "completed successfully"
          }
          else
          {
              If ($Action -eq "install")
              {
                  Write-Host $PackageId "failed to $Action. Ensure the proper dependencies have been installed or that it isn't already installed."
              }
              Else {
                  Write-Host $PackageId "failed to $Action. It may not currently be installed."
              }        
          }
      
          Unregister-ScheduledTask -TaskName $TaskName -Confirm:$false
      }
      
      InstallDotNetCoreGlobalTool "Amazon.Lambda.Tools" "uninstall"
      

      【讨论】:

        猜你喜欢
        • 2012-02-27
        • 1970-01-01
        • 2017-07-07
        • 1970-01-01
        • 2011-07-27
        • 1970-01-01
        • 2011-07-12
        • 2015-11-30
        • 2011-01-27
        相关资源
        最近更新 更多