Talvez você possa usar esse C # Code rápido, mas muito fácil de usar. Eu sugeriria colocar isso em um "Serviço" próprio que será implantado (por exemplo, sobre o GPO) nas máquinas de destino.
Então, o que o código: Ele cria um manipulador de eventos em "NetworkInformation.NetworkAddressChanged", que sempre dispara, se algo nas interfaces de rede mudar (por exemplo, o WIFI foi desativado, o endereço IP foi alterado, o laptop foi colocado na ethernet). Em seguida, ele verifica se pelo menos uma interface de rede ethernet está funcionando: se assim for, inicie o serviço "Windows Update" - se não, pare o serviço "Windows Update"
namespace WindowsUpdateLANOnly
{
class Program
{
static void Main(string[] args)
{
//NetworkInformation from reference: System.Net.NetworkInformation
NetworkChange.NetworkAddressChanged += new NetworkAddressChangedEventHandler(AddressChangedCallback);
Console.WriteLine("Listening for address changes. Press any key to exit.");
Console.ReadLine();
}
private static void AddressChangedCallback(object sender, EventArgs e)
{
//handle only events from the ethernet network interface
var adapters = NetworkInterface.GetAllNetworkInterfaces().Where(p => p.NetworkInterfaceType == NetworkInterfaceType.Ethernet);
//check if we have at least one ethernet network interface online
bool isOnLAN = false;
foreach (NetworkInterface ethernetNetwork in adapters)
{
Console.WriteLine(" {0} is {1}", ethernetNetwork.Name, ethernetNetwork.OperationalStatus);
if (ethernetNetwork.OperationalStatus == OperationalStatus.Up)
{
isOnLAN = true;
}
}
//deactivate or activate the windows update service
WindowsUpdateService(isOnLAN);
}
private static void WindowsUpdateService(bool start)
{ //ServiceController from reference: System.ServiceProcess
ServiceController sc = new ServiceController("Windows Update");
Console.WriteLine("Try to {0} the windows update service", start?"Activate":"Deactivate");
if (start) //should start
{
if(sc.Status.Equals(ServiceControllerStatus.Stopped) ||
sc.Status.Equals(ServiceControllerStatus.StopPending))
{
sc.Start();
//var timeout = new TimeSpan(0, 0, 5); // 5 seconds
//sc.WaitForStatus(ServiceControllerStatus.Running, timeout);
Console.WriteLine("Windows update service started");
}
}
else //should stop
{
if (sc.Status.Equals(ServiceControllerStatus.Running) ||
sc.Status.Equals(ServiceControllerStatus.StartPending))
{
sc.Stop();
//var timeout = new TimeSpan(0, 0, 5); // 5 seconds
//sc.WaitForStatus(ServiceControllerStatus.Stopped, timeout);
Console.WriteLine("Windows update service stopped");
}
}
}
}
}
O que você acha?