通过c#运行powershell脚本

时间:2012-07-28 17:49:35

标签: c# powershell cmd

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

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

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

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

2 个答案:

答案 0 :(得分:3)

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

答案是“冒充”:

答案 1 :(得分:0)

使用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 写主机“更改注册表” Start-Sleep -s 10

cmd脚本:

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

在我的Windows窗体程序中,我有一个按钮单击事件调用cmd脚本。看起来它有效,没有崩溃,cmd执行它应该,它写入主机,它睡眠10秒。但注册表项永远不会改变。但是我的第一个powershell重命名脚本和cmd的例子与单击Windows窗体上的按钮完美配合。所以我只是不明白。