我正在尝试对现有的C#Winforms工具进行返工。 想法是将Powershell用于对计算机的特定命令。
我有一个BindingList,在单击按钮时将用ADComputer对象填充它们,这些计算机将被异步ping通。当每台机器返回其ping时,该代码先前都会使用ManagementOperationObserver触发WMI查询。在ObjectReady上,它将返回登录的用户名。
出于性能和维护的原因,我想将Powershell用于代码的WMI部分。
我当时在考虑Powershell自动化类,但是当脚本完成后需要向GUI报告时,我需要一个事件。由于这将是异步操作,因此代码也不应阻止其他计算机执行代码。我不知道这是否是最好的选择。
这是代码设置:
private BindingList<ADComputer> ADComputers = new BindingList<ADComputer>();
private void SearchADButton_Click(object sender, EventArgs e) {
ADComputers.Clear();
//Code to fill ADComputers...
for (int i = 0; i < ADComputers.Count; i++) {
int index = i;
Ping ping = new Ping();
ping.PingCompleted += (sender2, e2) => Ping_PingCompleted(sender2, e2, index);
ping.SendPingAsync(ADComputers[i].Name);
}
}
private void Ping_PingCompleted(object sender, PingCompletedEventArgs e, int index) {
if(e.Error == null && e.Reply.Status.Equals(IPStatus.Success)) {
ADComputers[index].Online = "Online";
PClist.InvalidateRow(index);
//Powershell goes here!!!
}
else {
ADComputers[index].Online = "Offline";
ADComputers[index].LoggedIn = "/";
PClist.InvalidateRow(index);
}
}
任何人都可以解释和/或举例说明这样做的最佳做法吗?