Я пытаюсь переделать существующий инструмент C # Winforms.Идея состоит в том, чтобы использовать Powershell для определенных команд компьютерам.
У меня есть BindingList, который будет заполнен объектами ADComputer при нажатии кнопки, эти машины будут пинговаться асинхронно.Когда каждый отдельный компьютер возвращает свой пинг, код ранее запускал WMI-запрос с использованием ManagementOperationObserver.В 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);
}
}
Может кто-нибудь объяснить и / или привести пример лучших практик, как это сделать?