将powershell脚本嵌入到c#程序中

man*_*ted 5 .net c# powershell

第一次海报,如果这是不正确的,请见谅

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

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

最终目标:

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

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

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

到目前为止我知道什么?

我看过一些链接,例如:https : //blogs.msdn.microsoft.com/kebab/2014/04/28/executing-powershell-scripts-from-c/ //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# 方面只是让我得到一个漂亮的图形用户界面希望将所有内容保持在一起

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

squ*_*808 2

这个问题相当普遍和广泛,所以我认为它取决于很多个人决定。最佳实践可能涉及在推送已正确设置执行策略的映像后运行的自定义签名脚本,但这听起来不适合您。所以,我将根据假设进行工作。

既然您最后谈到将计算机运送给客户,我将假设您在域之外使用脚本来回答这个问题,其中最佳实践是使用代码签名(以及 RemoteSigned 或AllSigned 执行策略)。如果这仍然是一种选择,那么已经有足够资源 可用。

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

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

C# 路线

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

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

PoSh 中的 GUI

如果你真的想要一个 GUI 并且没有人能说服你,如果你不想自己编码(专业提示:不要),有很多工具可以帮助你。寻找那些直接将其构建到 PoSh 代码中的文件,以便它保留在一个文件中,但请注意,有些文件可能会使代码变得非常混乱。

我的建议

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

  1. 将所有 PoSh 脚本合并到一个脚本中,并使用正确编写的函数分离功能。
  2. 为脚本创建一个主函数,向用户呈现一个选项列表,代表您在步骤 1 中创建的所有函数。让用户输入数字或字母来选择要继续执行的函数。
  3. 运行该函数,收集所需的任何输入(如果重命名计算机,则提示输入计算机名称等),完成后向用户提供结果
  4. 提示用户是否要再次运行或退出。
  5. 退出后,告诉脚本先删除bat文件,然后删除自身。(测试源脚本时小心不要这样做!)

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