【问题标题】:Embedding powershell scripts into c# program将powershell脚本嵌入到c#程序中
【发布时间】:2016-04-07 09:32:09
【问题描述】:

第一次发帖,如有错误请见谅

我是 IT 系统管理员/一般 IT 管理员

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

最终目标:

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

我的想法是:创建一个 c# 程序(我以前从未使用过 c#)但是如果我能学到足够的知识来创建一个程序,你可以按下一些按钮来启动我的特定 powershell 脚本。

  • 低级 - 一个基本的表单,用于启动硬编码 powershell 脚本的按钮(本质上是将我的脚本复制粘贴到按钮代码中)
  • high level - 一个漂亮的 GUI,带有从 Internet 启动 powershell 脚本或在 .exe 中分离嵌入式资源的按钮,如果需要提示用户输入,它会在 Nice GUI 中进行提示,然后将其传递回脚本?

到目前为止我知道什么?

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

你能在 .exe 中嵌入 .ps1 资源之类的吗?所以我可以在按钮启动时硬编码“.\Script1.ps”?而不是 D:\Temp\Script.ps1..我知道我仍然需要每次编译 .exe,但至少它会更整洁一些

我试过在这里搜索和谷歌搜索,但我还没有完全找到我要找的东西。 这是最佳做法吗?我在互联网上看到人们说 powershell 可以做 C# 所做的事情,反之亦然......我想这样做的原因是我已经创建了 powershell 脚本,而它的 c# 方面只是让我得到一个漂亮的图形用户界面,希望能把所有东西放在一起

非常感谢您的帮助,如果这个问题太长/太混乱,我深表歉意

【问题讨论】:

  • 你可以添加任何东西作为嵌入资源

标签: c# .net powershell


【解决方案1】:

这个问题相当笼统和广泛,所以我认为它取决于很多个人决定。最佳实践可能涉及您在推送已正确设置执行策略的图像后运行的自定义签名脚本,但听起来这不是您的选择。所以,我会做一些假设。

由于您最后谈到将计算机运送给客户,因此我将假设您在最佳实践适用的域外部的容量中使用脚本来回答这个问题到 use code signing (and the RemoteSigned or AllSigned execution policy)。如果这仍然是一个选项,那么已经有 plentyresources available 了。

您还提到将文件复制到计算机上,然后必须删除它们,这促使您希望尽可能少地使用文件。我再次假设这是由于需要人们在特定时间运行特定脚本,出于特定原因(这就是您想要 GUI 的原因)。

您还提到您的目标是从用户视图中删除 PoSh 控制台,但随后您谈到拥有 GUI,所以我假设您运行脚本的人员不喜欢处理复杂性。

C# 路线

因此,假设这是一件大事,可以花时间学习 C#。当您invoke PowerShell from C# 时,您仍然受制于机器的执行策略,因为您仍在 C# 中启动 PowerShell 主机。因此,您将处理执行策略的更改(然后在完成后将其更改回来)。根据脚本的长度,您可以使用嵌入式资源,也可以简单地将它们保存为字符串。

正如您所说,您必须考虑更新 GUI 和按钮以在任何情况发生变化时启动脚本,这样可能会变得混乱且快速。

PoSh 中的 GUI

如果您真的想要一个 GUI,但没有人能说服您,如果您不想自己编写代码,那么有很多工具可以帮助您实现这一点(提示:不要) .寻找将其直接构建到您的 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。 (在测试源脚本时小心不要这样做!)

您仍将拥有一个 .bat 文件和一个 PoSh 脚本,但您的用户会更容易使用它,完成后它会自行清理,最重要的是,您不会有学习 C# 和必须做所有额外的工作来维护和重新编译 .exe 文件。

【讨论】:

  • 非常感谢 squid :) 你的假设几乎是正确的!哈我确实认为更简单的方法是第一次将我的 powershell 脚本整理成一个大文件……我还没有创建函数,但我想我应该先这样做,这将有助于我的知识……到目前为止一切都是分开的,因为我只是试图摆脱重复性任务和测试等,这似乎很简单,我可能仍然沿着 C# 路线走,只有在时间允许的情况下,我实际上可以学习它......我想我可能有对它可能有多简单有点天真..但是现在,整理脚本是第一要务
  • 我的荣幸!函数的美妙之处在于它使您的代码可重用,就像预构建的 cmdlet 一样。例如,您可以创建一个 Set-ComputerName 并且您可以让它调用您想要的任何参数。 C# 路线的问题在于,如果您仍在学习 PowerShell 的基本知识,那么尝试混合使用一种全新的语言可能会很快让人感到困惑——如果您遇到问题,是 C# 还是 PoSh 问题?以这种方式进行故障排除可能会让人感到困惑。无论哪种方式,坚持下去,你很快就会得到它!
猜你喜欢
  • 2021-04-06
  • 2015-07-07
  • 1970-01-01
  • 2020-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-22
  • 2020-10-05
相关资源
最近更新 更多