我有几个问题。这是它的工作原理。在Windows窗体上,用户单击该按钮。该按钮执行cmd脚本,然后cmd脚本执行powershell脚本。
为什么要问你的cmd脚本?好吧,如果我点击按钮运行一个powershell脚本我有签名问题。
在powershell脚本的开头,我将执行策略设置为不受限制。如果我直接通过powershell运行脚本,这将完全改变执行策略并且脚本可以工作。如果我让用户单击按钮运行powershell脚本,它表示我有签名问题,即使执行策略确实设置为不受限制!荒谬。我发现在cmd脚本中设置执行策略修复了这个问题,这就是我在单击按钮时运行powershell脚本的方法。无论如何,这是一个工作,它的工作原理。
我现在的问题是我有一个cmd脚本调用powershell脚本来更改注册表项。通过单击按钮再次完成此操作。它看起来很好,一切似乎都有效,但密钥的价值不会改变。现在,如果我只是在没有我的Windows窗体应用程序的情况下运行cmd脚本,那么键的值确实会发生变化。为什么会这样呢?
答案 0 :(得分:3)
我认为您的实际问题是“我如何从C#调用Powershell脚本,并确保它以管理权限运行?”
答案是“冒充”:
答案 1 :(得分:0)
使用automation.runspaces命名空间给我带来了很多问题。我是一名学生,我在一所大学工作。我正在使用大学计算机和大学领域。长话短说,我已经放弃了使用运行空间,我只需在c#中打开powershell并执行脚本。没有工作,所以我写了一些cmd脚本。这是一个有效的例子:
Powershell脚本:
$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窗体上的按钮完美配合。所以我只是不明白。