C#:以编程方式检测 Windows Server 已启动

标签 c# winlogon

我正在使用 C# 开发一个自动化进程,该进程将远程重启 Windows (2008/2012/2016) 服务器,我需要等到该服务器恢复在线后再继续。

我知道“返回在线”可能含糊不清,因此根据我的要求,我需要服务器返回到 Ctrl-Alt-Del 屏幕。 这样做的原因是在继续之前让服务器处于一致状态。根据我的经验,有几个因素可能会阻止服务器到达此屏幕,例如安装的 Windows 更新卡在重启周期或卡在“等待本地 session 管理器”等。

我花了几天时间研究这个问题,但无济于事:

  • 服务器显然在可用之前就开始响应 ping 请求
  • 系统启动时间发生在服务器达到所需状态之前
  • 任何指示系统已启动的事件都会在所需状态之前记录下来
  • 我不能简单地轮询基本服务 - 当 Windows 在登录之前应用计算机更新时,这些服务可能已经启动。此外,有时服务器会在这个阶段安装更新时自行重启,这可能会导致误报。
  • 轮询 CPU 事件也可能产生误报或引入延迟

有没有检测到 Windows 服务器已完成启动并可用于交互式登录的方法?

最佳答案

听起来您已经涵盖了我所知道的大部分可能方法。这让我又回到了蛮力的想法。我很好奇你在做什么,你不能在盒子上安装 Windows 服务(或者因为数量而不太可行)

首先只是尝试远程登录或其他任何方式,并有一些方法来测试它是否失败,等待 1 分钟,再试一次。但似乎这可能会以某种方式给您带来副作用?

我对不影响状态的蛮力方法的想法:

  • 每 1-5 秒 Ping 一次
  • 一旦它开始响应
  • 等待 5 或 10 甚至 15 分钟,同时仍在 ping 它
  • 如果 ping 失败重置该计时器(Windows 更新重启情况)
  • 然后漂亮相信您处于正确的状态。

对于可能有数千台服务器,我无法想象每台 15 分钟会有什么大不了的,特别是如果它足够一致以能够在更大的批处理中运行

关于C#:以编程方式检测 Windows Server 已启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51411030/

相关文章:

c - 自定义 Windows 身份验证包的实现 - LsaApUserLogonEx

c++ - 自定义 Windows 身份验证包登录失败

c# - C# 中的线程和 lambda

c# - OpenXML:Excel,提取单元格文本和图像/图片数据

c# - 使网站仅在 HTTPS 上运行

c# - 我如何在 Windows(xp、vista、7)欢迎屏幕或锁定屏幕(如 VNC 或 Dame Ware)中进行交互

c# - 如何使用 NServiceBus 执行集成测试?

c# - 在 C# 中重用 xml

c++ - 适用于 Vista/Windows 7 的凭证管理器