从 C# 执行多行 PowerShell 脚本

2023-12-13

我是 PowerShell 新手。我正在尝试从 C# 执行 PowerShell 脚本。我编写的 PS 脚本将 xml 文件从主机(运行 PS 脚本)传输到远程计算机。脚本如下

$Username = "User"
$Password = "Pass"
$SecurePass = ConvertTo-SecureString -AsPlainText $Password -Force"
$Cred = New-Object System.Management.Automation.PSCredential -ArgumentList     $Username,$SecurePass"
 $contents = [IO.File]::ReadAllBytes("D:\MyFile.xml")
 Invoke-Command -ComputerName ComputerName -Credential $Cred {[IO.File]::WriteAllBytes("D:\MyFile.xml",$using:contents)}

我将文件传输到的远程计算机的用户名和密码存储在变量中。将密码转换为安全字符串并创建包含用户名和密码的凭证对象。使用凭据将文件内容从我的计算机复制到远程计算机。 如果我从我的 powershell 中一一执行这些命令,或者从我的计算机上的 .ps1 powershell 脚本运行这些行,则该代码可以正常工作。

我在 C# 中使用以下代码来执行上述脚本并传输文件。

        Runspace runSpace = RunspaceFactory.CreateRunspace();

        Pipeline pipeline = runSpace.CreatePipeline();

        runSpace.Open();

        string script = "";
        script = "$Username = \"User\"\n";
        script = script + "$Password = \"Pass\"\n";
        script = script + "$SecurePass  = ConvertTo-SecureString -AsPlainText $Password -Force\n";
        script = script + "$Cred = New-Object System.Management.Automation.PSCredential -ArgumentList $Username,$SecurePass\n";
        script = script + "$contents = [IO.File]::ReadAllBytes(\"D:\\MyFile.xml\")\n";
        script = script + "Invoke-Command -ComputerName ComputerName -Credential $Cred {[IO.File]::WriteAllBytes(\"D:\\MyFile.xml\",$using:contents)}\n";

        //   pipeline.Runspace.SessionStateProxy.SetVariable

        pipeline.AddScript(script);


        Collection<PSObject> results = pipeline.Invoke();

但是,它没有传输文件。所以,我想我需要将脚本中的每一行逐一添加到管道中,然后执行它。所以我把它改为以下。

        string[] commands = script.Split('\n');

        foreach (string command in commands)
        {
            pipeline.AddScript(command);
        }

        Collection<PSObject> results = pipeline.Invoke();

它也不起作用。我在计算机上从 C# 代码执行了单个 Invoke-Command,效果很好。另外,如果我尝试执行其他单个 PS 命令,它们会起作用。因此,我评估像 $User = "user" 这样的变量值设置在 C# 中是行不通的。

我使用 SessionStateSetProcy.SetVariable 在 powershell 会话中存储变量值,如下所示。

        pipeline.Runspace.SessionStateProxy.SetVariable("User", "User");
        pipeline.Runspace.SessionStateProxy.SetVariable("Password", "Pass");
        var value = pipeline.Runspace.SessionStateProxy.GetVariable("Password");
        Console.WriteLine(value);

所以,我也能够设置值并检索。但是,由于我使用 ConvertTo-SecureString 等其他 cmdlet,我意识到我需要在代码中单独执行这些 cmdlet。

我终于想出了下面的代码。

        pipeline.Runspace.SessionStateProxy.SetVariable("User", "User");
        pipeline.Runspace.SessionStateProxy.SetVariable("Password", "Pass");



        Command command = new Command("ConvertTo-SecureString");
        string pass_value = pipeline.Runspace.SessionStateProxy.PSVariable.GetValue("Password").ToString();
        command.Parameters.Add("AsPlainText",pass_value);
        command.Parameters.Add("Force");

        pipeline.Runspace.SessionStateProxy.SetVariable("SecurePass",command);

        /*Build a command2*/
        Command command1 = new Command("New-Object");
        string user_name = pipeline.Runspace.SessionStateProxy.PSVariable.GetValue("User").ToString();
        command1.Parameters.Add("TypeName", "System.Management.Automation.PSCredential");
        string args = user_name + " , "+pass_value;
        command1.Parameters.Add("-ArgumentList", args);


        pipeline.Runspace.SessionStateProxy.SetVariable("Cred", command1);

        byte[] wifiXML = System.IO.File.ReadAllBytes(@"D:\MyFile.xml");
        pipeline.Runspace.SessionStateProxy.SetVariable("contents", wifiXML);


        Object a = pipeline.Runspace.SessionStateProxy.PSVariable.GetValue("contents");
        string script = "Invoke-Command -ComputerName ComputerName -Credential $Cred {[IO.File]::WriteAllBytes(\"D:\MyFile.xml\",$using:contents)}";

        pipeline.Commands.AddScript(script);
        Collection<PSObject> results = pipeline.Invoke();

它在 System.Management.Automation 中出现了一些奇怪的错误。我知道在 SetVariable 中我通过传递命令变量做错了。

我也尝试过 PowerShell ps = PowerShell.Create() 而不是管道,并尝试了 ps.AddCommand 和 ps.AddParameters,然后还尝试了 ps.AddArgument。但我不确定一旦我通过 ps.AddCommad、ps.AddArgument 等运行 cmdlet ConvertTo-SecureString,我应该如何将其输出值设置为 $Cred 变量?

我知道这个问题的解决方案不会这么复杂,并且必须有人通过 C# 执行了多行 powershell 脚本。我想要完成的就是执行从 C# 代码开始中提到的 .ps1 脚本行。我已经尝试了很多方法,包括上面提到的方法,但没有用,所以任何与之相关的帮助将不胜感激?


尝试用这种方法

 string script = @"
$Username = 'User'
$Password = 'Password'
$SecurePass = ConvertTo-SecureString -AsPlainText $Password -Force
$Cred = New-Object System.Management.Automation.PSCredential -ArgumentList     $Username,$SecurePass
$contents = [IO.File]::ReadAllBytes('D:\MyFile.xml')
Invoke-Command -ComputerName ComputerName -Credential $Cred {[IO.File]::WriteAllBytes('D:\\MyFile.xml',$using:contents)}
";

 pipeline.Commands.AddScript(script);
 Collection<PSObject> results = pipeline.Invoke();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 C# 执行多行 PowerShell 脚本 的相关文章

  • 显示 div 内的用户名列表

    我是 jQuery 新手 在我的项目中 我创建了一个类User其中代码如下所示 static ConcurrentDictionary
  • 读取大文件并制作字典

    我有一个大文件 我需要读取它并从中制作字典 我希望这一切能够尽可能快 然而我的Python代码太慢了 这是一个显示问题的最小示例 首先制作一些假数据 paste lt seq 20000000 lt seq 2 20000001 gt la
  • 无需登录即可在 Intranet 上获取 Web 应用程序的域\用户名

    我的 Intranet 上有一个 Web 应用程序 VS 2005 有几个页面不需要用户登录应用程序 反馈和默认页面 我正在尝试获取要显示和 或发送反馈的域名和用户名 有没有一种方法可以在不需要用户登录的情况下执行此操作 我试过了this
  • 当 foreach 块的内容具有 Conditional 属性时,C# 编译器是否会对其进行优化?

    我正在工作中编写一些调试代码 我想知道我所做的是否会损害性能 让我们看一下代码 foreach var item in aCollection Debug WriteLine item Name 我知道 Debug 类使用 Conditio
  • C语言中没有循环可以打印数组吗?

    例如 在Python中 如果我们将一个列表作为数组 它会直接用一行代码打印整个数组 有什么办法可以用C语言实现同样的事情吗 简短回答 No 对表格上几乎所有问题的简短回答 用 C 语言做 X 工作能像用 Python 一样简单吗 No 长答
  • c 使用 lseek 以相反顺序复制文件

    我已经知道如何从一开始就将一个文件复制到另一个文件 但是我如何修改程序以按相反的顺序复制它 源文件应具有读取访问权限 目标文件应具有读写执行权限 我必须使用文件控制库 例如 FILE A File B should be ABCDEF FE
  • += 运算符在 C++ 中是如何实现的?

    这是我一直在思考的一个问题 但从未找到任何资源来说明这个问题的答案 事实上它不仅是为了 也适用于它的兄弟姐妹 即 等等 当然不是 考虑这个例子 int a 5 a 4 this will make a 9 现在考虑等效表达式 a a 4 T
  • 使用 catch all 字典属性将 json 序列化为对象

    我想使用 JSON net 反序列化为对象 但将未映射的属性放入字典属性中 是否可以 例如给定 json one 1 two 2 three 3 和 C 类 public class Mapped public int One get se
  • 确定相关词的编程方式?

    使用网络服务或软件库 我希望能够识别与词根相关的单词 例如 座位 和 安全带 共享词根 座位 但 西雅图 不会被视为匹配 简单的字符串比较对于这类事情似乎是不可行的 除了定义我自己的字典之外 是否有任何库或 Web 服务不仅可以返回单词定义
  • 如何在 ASP.NET Core 项目中使用 MStest 测试 Ok() 结果

    我正在使用 MStest 来测试我的控制器 我想测试这个动作 HttpGet Name GetGroups public async Task
  • 删除数组时出现访问冲突异常

    删除分配的内存时 出现 访问冲突读取位置 异常 如下所示 我有一个针对 Visual Studio 2010 工具集 v100 C 编译器编译的本机 dll 我有一个针对它的托管 dll 包装器 它是针对工具集 v90 编译的 因为我想以
  • 文本框中“结束编辑”的事件

    我正在 winform c 中使用文本框 并使用文本在数据库中进行查询 但每次文本更改时 我都需要不断查阅文本框的文本 因此 对于这些 我使用 KeyUp 但这个活动太慢了 文本框编辑完成后是否会触发任何事件 我考虑完成2个条件 控制失去焦
  • 如何阻止 Control-I 在 CoreWindow 范围内的 UWP 文本框中插入选项卡?

    当我在 UWP 应用程序中有一个 TextBox 时 对我来说 奇怪的行为 在 Windows 10 中创建通用的空白应用程序 UWP 应用程序 使用以下代码将文本框添加到默认网格
  • 禁止非 PowerShell 命令的输出?

    我正在运行命令 hg st 然后检查它是 LASTEXITCODE检查当前目录中 Mercurial 的可用性 我不关心它的输出 也不想将它展示给我的用户 如何抑制所有输出 成功或错误 由于 Mercurial 不是 PowerShell
  • 如何使 WinForms UserControl 填充其容器的大小

    我正在尝试创建一个多布局主屏幕应用程序 我在顶部有一些按钮链接到应用程序的主要部分 例如模型中每个实体的管理窗口 单击这些按钮中的任何一个都会在面板中显示关联的用户控件 面板包含用户控件 而用户控件又包含用户界面 WinForms User
  • C# 模式匹配

    我对 C 有点陌生 我正在寻找一个字符串匹配模式来执行以下操作 我有一个像这样的字符串 该书将在 唐宁街 11 号接待处 并将由主要医疗保健人员参加 我需要创建一个 span 标签来使用 startIndex 和 length 突出显示一些
  • 检查另一种形式的线程是否仍在运行

    我有一个涉及两个窗体的 Windows 窗体应用程序 子表单用于将数据导出到 CSV 文件 并使用后台工作者写入文件 当这种情况发生时 我隐藏了表格 当后台工作程序运行时 父窗体仍然处于活动状态 因此即使后台工作程序正在写入文件 用户也可以
  • Web API 2.0 使用 pascalcase 模型接收驼峰式命名的 JSON 数据

    我正在尝试对我的 Web API 进行 PUT 调用 我在 WebApiConfig cs 中设置了以下内容 以处理以驼峰形式将数据发送回我的 Web 项目 config Formatters JsonFormatter Serialize
  • 在两个点之间创建一条曲线,每个点都具有标准化向量

    因此 我需要一种写入方法来在两点之间创建一条曲线 每个点都有一个指向任意方向的归一化向量 我一直在尝试设计这样一种方法 但一直无法理解数学 在这里 由于一张图片胜过一千个文字 这就是我所需要的 在图中 矢量垂直于红线 我相信向量需要进行相同
  • 线程安全的有限大小队列,不使用锁

    我正在尝试编写一个主题队列 但遇到死锁和其他多线程问题 我想用Interlocked CompareExchange避免lock用法 但这段代码并没有按预期工作 它只是擦除整个队列 我在这里做错了什么 public class FixedS

随机推荐

  • 修复 StackOverflow 错误

    我开发了一个应用程序 其中有 4 个选项卡 A B C D 每个选项卡都包含一个活动 在第四个选项卡 D 中 我添加了一个 ActivityGroup 其中还有 3 个活动 X Y Z 在第四个选项卡中 我添加了活动组 但出现 StackO
  • 保持输入占位符始终可见

    我正在尝试对网站中的所有输入进行样式设置 当它们具有值或具有焦点时 占位符将成为输入的标题 它移动到输入的顶部 但浏览器的默认行为会隐藏当有数据时占位符 我真的想远离 JS 解决方案 当前结果 我的CSS input focus webki
  • Java Manifest.mf 类路径问题

    我一直在尝试运行一个 jar 文件 我们称之为 test jar 它在 Unix 系统上使用 Sybase jconn3 jar 我创建了一个 MANIFEST MF 文件 其中包含以下内容 Class Path SYBASE jConne
  • 如何从不同的 main 方法调用 Cucumber 运行程序类

    我是使用命令行界面的新手 所以我只是有一个关于如何使用 CLI 技术调用 Cucumber 的 runner 类的问题 我有一个 Java 程序 其中包含一个 main 方法 当测试人员传递测试用例参数时 它将获取功能文件 java 程序调
  • 使用 Spring Cloud Config 重新启动 HikariCP

    我最近将我的应用程序配置为使用 Spring Cloud Config 和 Github 作为配置存储库 Spring Boot 2 1 1 RELEASE Spring Cloud 依赖项 Greenwich RC2 我的应用程序几乎使用
  • 在iOS10中,是否可以从静态库/框架内访问钥匙串,以进行单元测试

    在 Xcode 8 iOS 10 之前 我能够从静态库的单元测试中访问钥匙串 升级后 出现错误 请参阅堆栈跟踪 failed caught NSInternalInconsistencyException Couldn t add the
  • android中应用程序升级到新版本时如何保留全局变量?

    在我的 Android 应用程序中 用户必须通过同意提供电子邮件 ID 的条款和条件来注册 如果用户将应用程序升级到下一个版本 我不应该收到协议页面或电子邮件注册窗口 我使用全局变量控制它 但如果用户将应用程序升级到较新的版本 全局变量将被
  • PHP:使用 simplexml 循环遍历 XML 文件的所有级别

    我有一个函数 它使用 simplexml 返回 XML 文件中的第一级节点并将其写入无序列表 function printAssetMap xml simplexml load file X ASSETS assets xml gt ass
  • 如何选择sql复杂查询where Condition And or [关闭]

    Closed 这个问题需要细节或清晰度 目前不接受答案 我的桌子是 ID ATTRID VALSTR 1771373 1 1234 1771373 3 510 1771373 7 2016 1771373 8 05 1777623 3 50
  • codeIgniter使用mysql_real_escape_string()代替。数据库连接问题

    我在带有数据库的服务器上安装了代码点火器 我想在我的 mac 上运行相同的数据库 我使用 MAMP 并将项目文件夹复制到 htdocs 中 但出现此错误 请你帮帮我好吗 ErrorException 8192 mysql escape st
  • Angular 2:无法绑定到“ngModel”,因为它不是“input”的已知属性

    我正在尝试在 Angular 2 中实现动态表单 我向动态表单添加了删除和取消等附加功能 我已经遵循了这个文档 https angular io docs ts latest cookbook dynamic form html 我对代码做
  • 无法在 azure 机器学习服务工作区中注册 ONNX 模型

    我尝试以两种不同的方式将 ONNX 模型注册到 Azure 机器学习服务工作区 但遇到无法解决的错误 第一种方法 通过 Jupyter Notebook 和 python 脚本 model Model register model path
  • Matplotlib 类似于 matlab trisurf

    长话短说 我想用 python 绘制一个通用的 3D 三角形网格 Matplotlib 似乎是理想的候选者 但我会选择任何可以实现我将要描述的功能的 3D 渲染 假设我有一个由 X Y 和 Z 定义的三角形网格 点云的 3D 坐标 每个长度
  • Android - SSL/TLS 和 ECC(椭圆曲线加密)

    我正在开发一个与网络服务器通信的 Android 应用程序 我们使用 HTTPS 进行此通信 并且 Android 应用程序内还有一个客户端证书用于身份验证 我们使用 ECC ANSI x9 62 创建 SSL 证书 以便拥有非常小的证书
  • Opencv dll问题

    我正在遵循使用 opencv 进行对象检测的教程 我一步一步完成 但是当我运行它时 我收到此错误 The program can t start because opencv 244d dll is missing from your co
  • AVAudioSession :麦克风耳机作为输入,iPhone扬声器作为输出

    使用iOS10 有更多的可能性来管理AUdioSession 但我无法在音频通过iPhone扬声器发出时保持耳机麦克风作为输入 下面的 overrideOutputAudioPort 方法还将输入音频端口覆盖为 iphone 麦克风 let
  • Wpf面板后台问题

    当我不设置面板背景时 我无法获取鼠标事件 为什么有这种行为 我可以通过将背景设置为透明 默认情况下为空 来获取面板上的鼠标事件 空背景和透明背景有什么区别 When Background null它在渲染时不会向 MILCore 发出任何绘
  • Azure Analysis Services 是否支持服务主体登录 SQL Azure

    我有一个 Azure Analysis Services 模型 使用以下连接字符串从 SQL Azure 读取数据 Data Source MySQLAzureDB database windows net Initial Catalog
  • 不使用ros编译roscpp(使用g++)

    我正在尝试在不使用ROS其余部分的情况下编译roscpp 我只需要订阅一个节点 但该节点拥有使用旧版本ROS的节点 并且由于编译问题 我无法将我的程序与他的程序集成 我从git下载了源代码 https github com ros ros
  • 从 C# 执行多行 PowerShell 脚本

    我是 PowerShell 新手 我正在尝试从 C 执行 PowerShell 脚本 我编写的 PS 脚本将 xml 文件从主机 运行 PS 脚本 传输到远程计算机 脚本如下 Username User Password Pass Secu