我构建了一个监控应用程序,它将监控网络中几台不同服务器上的几项服务,我希望显示这些服务的状态以及它们是否仍在工作。
假设我想运行这个简短的Powershell脚本;
Get-Service -ComputerName "DESKTOP" -Name "WinDefend"
假设我想使用Timer事件每隔1分钟运行一次。
private void InitializeTimer()
{
// Call this procedure when the application starts
timer1.Interval = 60000; // 60 seconds
timer1.Tick += new EventHandler(timer1_Tick);
// Enable timer
timer1.Enabled = true;
}
// Timer tick
private void timer1_Tick(object sender, EventArgs e)
{
// Powershell script here
}
我如何在这个例子中实现这个简短的Powershell脚本呢?
我的第二个问题也是,如何在检索数据后正确显示数据?我是否可以将数据写入文本框或标签?
非常感谢您的反馈和/或帮助!
1条答案
按热度按时间5tmbdcev1#
C# WinForms调用PowerShell 5.1
要克服的问题:
1.要在C#中运行PowerShell 5.1版,我相信您的C#程序需要基于.NET Framework,可能是4.x。这可能不是真的,但我已经在这方面花费了比我预期的更多的时间,所以不打算研究替代方案。
1.虽然您可以通过额外的步骤从NuGet获取System.Management.Automation.dll,但它并不像完全更新的Windows 10系统上的PowerShell 5.1所使用的版本那么新。
Get-Service
版本,我相信6.x版本也一样,不提供ComputerName
参数,也不提供任何访问远程计算机的内置方法。有在远程系统上执行Get-Service
并返回结果的选项,但这也可能是有问题的-如防火墙问题、某些服务(s)未运行,我认为某些注册表项设置可能会导致问题等...Forms.Timer
类别可以更新表单上的控件,因为它使用相同的执行绪,BUT,这表示Get-Service
从远端计算机传回信息的等待时间为20秒,将会锁定该执行绪并冻结表单。使用正确版本的System.Management.Automation.dll生成VS C#项目:
一些通用步骤:
从Windows的PowerShell 5.1复制System.Management.Automation.dll的诀窍来自这里(同一页上的其他有用信息):https://stackoverflow.com/a/13485939/4190564
在设计窗体和控件时,我相信这是我使用的所有唯一设置:
这是真正的代码
最初的答案:
这福尔斯没有回答问题,但它确实说明了如何从PowerShell调用的C#中调用PowerShell。
如果您尝试执行单个PowerShell命令,则Run PSCmdLets in C# code (Citrix XenDesktop)和How to execute a powershell script using c# and setting execution policy?的答案可能会满足您的要求。
我现在在PowerShell中执行所有操作,因此创建一个调用调用PowerShell的C#的PowerShell脚本会更容易。此PowerShell脚本调用C#类
DoPS
的Run
方法,该方法调用Get-Service -ComputerName "." -Name "WinDefend"
,然后使用WriteLine语句模拟Get-Service
的预期输出:输出以下文本: