【问题标题】:Running a powershell script through c#通过c#运行powershell脚本
【发布时间】:2012-07-28 17:49:35
【问题描述】:

我有几个问题。这是它的工作原理。在 Windows 窗体上,用户单击按钮。该按钮执行一个 cmd 脚本,然后 cmd 脚本执行一个 powershell 脚本。

为什么你问的 cmd 脚本?好吧,如果我单击按钮运行一个 powershell 脚本,我会遇到签名问题。

在 powershell 脚本的开头,我将执行策略设置为不受限制。如果我直接通过 powershell 运行脚本,这将完全改变执行策略并且脚本可以正常工作。如果我让用户单击按钮来运行 powershell 脚本,它会说我在签名时遇到问题,即使执行策略确实设置为不受限制!荒谬的。我发现在 cmd 脚本中设置执行策略解决了这个问题,这就是我在单击按钮时运行我的 powershell 脚本的方式。无论如何,这是一种变通方法,并且有效。

我现在的问题是我有一个 cmd 脚本,它调用 powershell 脚本来更改注册表项。这通过单击按钮再次完成。看起来不错,一切似乎都正常,但是键的值没有改变。现在,如果我只是在没有 Windows 窗体应用程序的情况下运行 cmd 脚本,键的值确实会改变。为什么会这样?

【问题讨论】:

    标签: c# powershell cmd


    【解决方案1】:

    我认为您的实际问题是“如何从 C# 调用 Powershell 脚本,并确保它以管理权限运行?”

    答案是“冒充”:

    【讨论】:

      【解决方案2】:

      使用automation.runspaces 命名空间给我带来了很多问题。我是一名学生,我在一所大学工作。我正在使用大学计算机和大学域。长话短说,我放弃了使用运行空间,我只是在 c# 中打开 powershell 并执行脚本。那没有用,所以我写了一些 cmd 脚本。这是一个有效的例子:

      Powershell 脚本:

      重命名为 Mac 地址

      $OS = Get-WmiObject Win32_OperatingSystem
      $NIC = Get-WmiObject Win32_NetworkAdapterConfiguration | where{$_.IPEnabled -eq “TRUE”}
      $PC = Get-WmiObject -class Win32_ComputerSystem 
      
      if($NIC.MacAddress -eq $null)
          {
          Write-Host "No Network Connection! The PC will not be renamed until the network is enabled"
          }
      else
          {
          $MacAddress = $NIC.MacAddress
          $NewPCName = "PC-" + $MacAddress.Substring(0) -replace ':'
      
          $PC.Rename($NewPCName) 
      
          Write-Host -ForegroundColor Green "New PC Name"
          $NewPCName
          }
          write-Host "The PC has been renamed and will restart in 5 seconds."
          start-sleep -s 5
          restart-computer
      

      如果我在 powershell 中运行上述脚本,它就可以工作。如果我使用 Process.Start(powershell.exe, "C:\myscript");在 c# 中它不会运行。即使设置执行策略也无济于事。所以我使用一个cmd脚本如下:

      cmd脚本:

      powershell -noexit -executionpolicy unrestricted "C:\myscript.ps1"

      然后执行。

      现在我有以下内容:

      Powershell 脚本:

      Set-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" -name AutoAdminLogon -value 0 写主机“更改注册表” 开始-睡眠-s 10

      cmd脚本:

      powershell -noexit -executionpolicy unrestricted "C:\Windows\ITS\ChangeRegistry.ps1"

      在我的 Windows 窗体程序中,我有一个按钮单击事件调用 cmd 脚本。看起来它可以工作,没有任何崩溃,cmd按应有的方式执行,它写入主机,它休眠了10秒。但注册表项永远不会改变。但是我的第一个 powershell 重命名脚本和 cmd 示例只需单击 Windows 窗体上的按钮即可完美运行。所以我就是不明白。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-14
        • 2023-03-10
        • 1970-01-01
        • 2018-12-19
        相关资源
        最近更新 更多