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

标签 c# .net powershell

第一次发帖,如有不妥请见谅

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

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

最终目标:

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

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

  • 低级 - 一个基本的表单,启动硬编码的 powershell 脚本的按钮(本质上是将我的脚本复制并粘贴到按钮代码中)
  • 高级 - 一个漂亮的 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# 方面只是为了让我得到一个漂亮的 GUI 希望将所有内容保持在一起

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

最佳答案

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

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

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

您还提到您的目标是从用户 View 中删除 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 文件的所有额外工作。

关于c# - 将 powershell 脚本嵌入到 c# 程序中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36472084/

相关文章:

c# - 在应用程序配置文件中找不到名为 'MyEntities' 的连接字符串

c# - C#(或其他语言)中委托(delegate)的使用

c# - 从列表中选择所有字符串的最快方法

PowerShell 代码格式

C# 是否存在异常 ID

c# - 如何使用 TrueType 自定义嵌入字体在 WebBrowser 控件中显示内容?

c# - 为什么使用格式字符串 "1212012"调用 DateTime.TryParseExact 会因输入 "Mddyyyy"而失败

.net - 如何使用 .NET 确定 Windows 上网络接口(interface)的绑定(bind)顺序?

c# - CAKE 任务中的错误未显示在 TeamCity 概述中

c# - 向 'CreateUserWizard' 添加角色