将powershell脚本嵌入到c#program

时间:2016-04-07 09:32:10

标签: c# .net powershell

第1次海报,如果这不正确,那就很抱歉

我是IT SysAdmin / general I.T Admin

背景 我创建了一些单独的PowerShell脚本来执行一些基本的重复性任务,这可能是添加防火墙规则,重命名计算机,在PC上创建本地帐户。为了绕过计算机上的powershell脚本执行策略,我有一个.bat和一个ps1文件。我启动相关的.bat,然后启动执行工作的ps1文件。这些对我自己很好,因为我知道它们是如何工作的,我不介意使用powershell控制台等,但是将所需的.bat / ps1文件复制到计算机,执行然后删除文件然后发送到客户

结束目标:

  • 无需将多个.bat / .ps1复制到PC并单独运行每个脚本
  • 消除用户输入等的PowerShell控制台视图
  • 尝试只获得1个.exe(我的所有脚本都嵌入其中),我可以提供给团队的其他成员,这些成员基本上与powershell脚本相同,但看起来更好

我的想法是:创建ac#program(我以前从未使用过c#)但是如果我能够学到足够的东西来创建一个带有按钮的程序,那么你可以启动我特定的PowerShell脚本。< / p>

  • 低级别 - 一个基本表单,用于启动硬编码PowerShell脚本的按钮(基本上是将我的脚本复制到按钮代码中)
  • 高级 - 一个漂亮的GUI,带有按钮,可以从Internet启动PowerShell脚本或在.exe中单独的嵌入式资源,如果需要提示用户输入,它会在Nice GUI中提示然后将其传回脚本?

到目前为止我所知道的是什么?

我见过一些链接,例如: https://blogs.msdn.microsoft.com/kebab/2014/04/28/executing-powershell-scripts-from-c/ 我猜我可以将单个脚本代码硬编码到每个按钮中吗?但是如果我的脚本改变为im测试/改进,我需要继续重建.exe并更改每个按钮

你能嵌入.exe a .ps1资源吗?所以我可以硬编码&#34;。\ Script1.ps&#34;在按钮发射?而不是D:\ Temp \ Script.ps1 ..我明白我仍然需要每次编译.exe但至少它会更整洁

我试过在这里搜索和谷歌搜索,但我还没有找到我正在寻找的东西。 这是最佳做法吗?我在互联网上看到有人说powershell可以做C#做的事情,反之亦然......我想这样做的原因是我已经创建了powershell脚本,而且它的c#方面只适合我很好的GUI有希望保持一切

非常感谢你的帮助,如果这个问题太长/太乱,我道歉

1 个答案:

答案 0 :(得分:2)

这个问题相当普遍和广泛,所以我认为它会受到很多个人决定的影响。最佳实践可能涉及在推送已经适当设置执行策略的映像后运行的自定义签名脚本,但听起来这不适合您。所以,我会研究假设。

由于您谈到最后将计算机发送给客户,我将回答这个问题,并假设您在域 之外的容量中使用脚本,其中最佳做法是是 use code signing (and the RemoteSigned or AllSigned execution policy) 。如果这仍然是一个选项,那么plenty resources已经available

您还提到将文件复制到计算机并在之后必须删除它们,这样可以驱动您想要的文件尽可能少。我再次假设这是由于需要让人们在特定时间运行特定脚本,具体原因(这就是你想要GUI的原因)。

您还要提到您的目标是从用户视图中删除PoSh控制台,但之后您会谈到拥有GUI,因此我假设运行脚本的人不喜欢处理复杂性。< / p>

C#Route

所以,让我们说这是一个足够大的交易来花时间学习C#。当您invoke PowerShell from C#时,您仍然需要遵守机器的执行策略,因为您仍然在C#中启动PowerShell主机。因此,您将处理更改执行策略(然后在完成后更改它)。根据脚本的长度,您可以使用嵌入式资源,或者只需将它们保存为字符串。

就像你说的那样,你必须考虑更新GUI和按钮,以便在事情发生变化时启动脚本,这样可能会变得混乱和快速。

PoSh中的GUI

如果你真的想拥有一个GUI,没有人可以说服你,那么有很多工具可以帮助你,如果你不想自己做编码(protip:不要) 。寻找那些直接在你的PoSh代码中构建它的代码,这样它就会保留一个文件,但要注意有些文件会使代码变得非常混乱。

我的建议

可以说,根据您的需要,最佳解决方案可能不是best practice。为了使其保持在您的问题的相对范围内,我将执行以下操作:

  1. 将所有PoSh脚本合并到一个脚本中,并将功能与properly written functions分开。
  2. 为您的脚本创建一个主要功能,presents the user with a list of the options代表您为步骤1创建的所有功能。让用户输入数字或字母以选择要继续的功能。
  3. 运行该功能,收集所需的任何输入(如果重命名计算机,提示输入计算机名称等)并完成provide results to the user
  4. Prompt the user,如果他们想再次运行,或退出。
  5. 退出时,告诉脚本先删除bat文件,然后再删除delete itself。 (在测试源脚本时小心不要这样做!)
  6. 你仍然会有一个.bat文件和一个PoSh脚本,但是你的用户会更容易使用,它会在完成后自行清理,最重要的是,你不会有学习C#的开销和必须完成维护和重新编译.exe文件的所有额外工作。