介绍 这一次,我将尝试在 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”。