Uma maneira bastante direta seria sempre executar um script do PowerShell na inicialização que, em seguida, verifica se o domínio está disponível:
Try {
[System.DirectoryServices.ActiveDirectory.Domain]::GetComputerDomain() | Out-Null
} Catch {
# Code here
}
Se nenhum controlador de domínio puder ser contatado, o GetComputerDomain
lança uma exceção e a execução cai no bloco catch. Se o domínio estiver disponível, a função é bem-sucedida e o script termina.
É claro que o código em um script do PowerShell precisa ser o PowerShell, mas você pode executar o lote clássico despejando um script em um arquivo temporário, executando o processador em lote e, em seguida, excluindo esse arquivo:
Try {
[System.DirectoryServices.ActiveDirectory.Domain]::GetComputerDomain() | Out-Null
} Catch {
$tmpBat = [System.IO.Path]::GetTempFileName() + '.bat'
@"
rem PUT YOUR BATCH CODE HERE
"@ | Out-File $tmpBat -Encoding ASCII
cmd /c $tmpBat
Remove-Item $tmpBat
}
A falta de espaços em branco antes do código do lote é intencional; é necessário para o literal de cadeia multilinha (a coisa delineada por @"
e "@
), que evita que você precise lidar com o escape do PowerShell.