当前位置 : 主页 > 网络编程 > net编程 >

在 C# 中执行 PowerShell 脚本

来源:互联网 收集:自由互联 发布时间:2023-09-03
介绍 这一次,我将尝试在 C# 中执行 PowerShell 脚本。 有一些方法可以做到这一点。 例如,我可以使用 Process 类。 PsAccessor.cs using System.Diagnostics; namespace AccessPowerShellSample; public class PsAc

介绍

这一次,我将尝试在 C# 中执行 PowerShell 脚本。
有一些方法可以做到这一点。

例如,我可以使用 Process 类。

PsAccessor.cs

using System.Diagnostics;

namespace AccessPowerShellSample;

public class PsAccessor
{
public async Task<string?> ExecuteProcess()
{
using(var app = new Process())
{
app.StartInfo.FileName = "powershell.exe";
app.StartInfo.Arguments = "echo HelloWorld!!";
app.EnableRaisingEvents = true;
app.StartInfo.RedirectStandardOutput = true;
app.StartInfo.RedirectStandardError = true;
// Must not set true to execute PowerShell command
app.StartInfo.UseShellExecute = false;
app.Start();
using(var o = app.StandardOutput)
{
return await o.ReadToEndAsync();
}
}
}
}

我也可以上“PowerShell”课程。

所以我会在这个时候尝试一下。

使用 PowerShell 类。

要使用“PowerShell”,我必须添加一些 NuGet 包。

  • 系统.管理.自动化
  • Microsoft.PowerShell.Commands.Diagnostics
  • Microsoft.PowerShell.ConsoleHost
  • Microsoft.PowerShell.Commands.Utility
  • Microsoft.PowerShell.Commands.Management
  • Microsoft.WSMan.Management

PsAccessor.cs

using System.Management.Automation;

namespace AccessPowerShellSample;

public class PsAccessor
{
public string? GenerateHmacSha512(string inputData, string key)
{
using(var ps = PowerShell.Create())
{
ps.AddCommand("echo");
ps.AddArgument("Hello World!");
var results = ps.Invoke<string>();
return results.FirstOrDefault();
}
}
}

添加脚本

更复杂的情况呢?

例如,我将尝试通过 HMAC SHA-512 生成哈希值。

hashValueGenerator.ps1

param(
[Parameter()]
[String] $secret_key,
[String] $message
)
$oHMACSHA512 = New-Object System.Security.Cryptography.HMACSHA512
$oHMACSHA512.key = [Text.Encoding]::ASCII.GetBytes($secret_key)
$signature_rawout = $oHMACSHA512.ComputeHash([Text.Encoding]::ASCII.GetBytes($message))
$signature = ""
$signature_rawout | ForEach-Object { $i = [Convert]::ToString($_,16); if ($i.length -eq 1) { $i ='0' + $i }; $signature += $i }
  • ​​如何使用 PowerShell/HMAC-SHA - 与 Windows 共存​​

要执行它,我可以使用如下所示的“Process”。

public async Task<string?> ExecuteProcess(string key, string message)
{
using(var app = new Process())
{
app.StartInfo.FileName = "powershell.exe";
app.StartInfo.Arguments = $"$oHMACSHA512 = New-Object System.Security.Cryptography.HMACSHA512;$oHMACSHA512.key = [Text.Encoding]::ASCII.GetBytes('{key}');$signature_rawout = $oHMACSHA512.ComputeHash([Text.Encoding]::ASCII.GetBytes('{message}'));$signature = '';$signature_rawout | ForEach-Object {{ $i = [Convert]::ToString($_,16); if ($i.length -eq 1) {{ $i ='0' + $i }}; $signature += $i }};[Convert]::ToBase64String($signature_rawout)";
app.EnableRaisingEvents = true;
app.StartInfo.RedirectStandardOutput = true;
app.StartInfo.RedirectStandardError = true;
// Must not set true to execute PowerShell command
app.StartInfo.UseShellExecute = false;
app.Start();
using(var o = app.StandardOutput)
{
return await o.ReadToEndAsync();
}
}
}

虽然我可以得到结果,但是很难调试。

我也可以使用 PowerShell 脚本文件。

public string? GenerateHmacSha512(string key, string message)
{
using(var ps = PowerShell.Create())
{
ps.AddScript(File.ReadAllText("./hashValueGenerator.ps1"));
ps.AddParameter("secret_key", key);
ps.AddParameter("message", message);
var results = ps.Invoke<string>();
return results.FirstOrDefault();
}
}

我可以使用“AddCommand”来做到这一点。
但是我会因为 PowerShell 执行策略而出错。

Unhandled exception. System.Management.Automation.PSSecurityException: File C:\Users\example\OneDrive\Documents\workspace\AccessPowerShellSample\hashValueGenerator.ps1 cannot be loaded because running scripts is disabled on this system. For more information, see about_Execution_Policies at https://go.microsoft.com/fwlink/?LinkID=135170.
...

所以我认为我应该使用“AddScript”。

上一篇:『 再看.NET7』泛性特性使用场景
下一篇:没有了
网友评论