从 C# 失败导入 PowerShell 模块

本文关键字:PowerShell 模块 导入 失败 | 更新日期: 2023-09-27 17:56:16

我已经看到了很多解决方案,但没有一个能解决我的问题。我正在尝试将一个名为"DSInternals"的自定义PowerShell模块导入我的C# DLL。

https://github.com/MichaelGrafnetter/DSInternals

我的代码中的所有内容似乎都很好,但是当我尝试获取可用模块时,它没有加载。

流的响应为

术语"Get-ADReplAccount"不被识别为 cmdlet、函数、脚本文件或可操作程序的名称。检查名称的拼写,或者如果包含路径,请验证路径是否正确,然后重试。

我在哪里出错了这个代码?

InitialSessionState init = InitialSessionState.CreateDefault();
init.ImportPSModule(new string[] { @"D:''DSInternals''dsinternals.psd1" }); //location of the module files
Runspace runspace = RunspaceFactory.CreateRunspace(init);
runspace.Open();
PowerShell ps = PowerShell.Create();
ps.Runspace = runspace;
ps.Commands.AddCommand("Get-ADReplAccount"); //this command is un-recognized
foreach (PSObject result in ps.Invoke())
{
    Console.WriteLine(result); //this always returns null
}

从 C# 失败导入 PowerShell 模块

问题是内置模块的.NET框架版本。将使用更高版本的 .NET 框架生成的模块添加到 C# 类将不起作用。该模块是在 4.5.1 中构建的,我正在使用版本 2,添加

init.ThrowOnRunspaceOpenError=true;

帮助捕获错误的原因。

这是我的最终代码

        InitialSessionState init = InitialSessionState.CreateDefault();
        init.ImportPSModule(new string[] { @"D:''DSInternals''dsinternals.psd1" }); //location of the module files
        init.ThrowOnRunspaceOpenError = true;
        Runspace runspace = RunspaceFactory.CreateRunspace(init);
        runspace.Open();
        var script =
            "Get-ADReplAccount -SamAccountName peter -Domain BLABLA -Server dc.BLABLA.co.za -Credential $cred -Protocol TCP"; //my powershell script
        _powershell = PowerShell.Create().AddScript(script);
        _powershell.Runspace = runspace;
        var results = _powershell.Invoke();
        foreach (var errorRecord in _powershell.Streams.Progress)
            Console.WriteLine(errorRecord);
        foreach (var errorRecord in _powershell.Streams.Debug)
            Console.WriteLine(errorRecord);
        foreach (var errorRecord in _powershell.Streams.Error)
            Console.WriteLine(errorRecord);
        foreach (var errorRecord in _powershell.Streams.Warning)
            Console.WriteLine(errorRecord);
        var stringBuilder = new StringBuilder();
        foreach (var obj in results)
        {
            stringBuilder.AppendLine(obj.ToString());
        }
        return stringBuilder.ToString();