1

我正在开发一个系统,其中各种 Windows 服务在专用网络中的不同计算机上运行。网络中的任何计算机都可以运行与这些服务远程交互的客户端应用程序。作为我们软件包的一部分,我们的功能可以让用户查看网络中的任何服务是否遇到问题并重新启动其中的任何服务。

为了让它工作,我们使用了用户模拟服务控制器类:我们要求用户提供托管服务的计算机上的管理帐户的用户名和密码,模拟该管理员,然后使用 ServiceController 重新启动服务。这在大多数情况下都有效,但我们无法在我们的某些服务器上模拟管理员。我的理解是,要使用户模拟工作,被模拟的帐户必须在本地计算机上或 Active Directory 组的一部分,但有问题的服务器只有它们自己的本地帐户。

我注意到LogonUser启动模拟的方法有很多参数,并开始使用它们来查看是否有任何参数可以解决我的问题。当我尝试将 LogonType 值设置为“New Credentials”(9)时,我看到了一些奇怪(但可能有用)的行为:

  • 我可以在以前无法使用的服务器上重新启动服务
  • 如果我尝试重新启动已关闭的服务并提供不正确的密码,该服务仍会重新启动。

为什么我会看到这种行为?如果这样做的原因是好的,我可能会使用此设置来完全摆脱要求用户完全登录的情况。

4

1 回答 1

1

我弄清楚发生了什么:

根据Getting the Current username when impersonated,当使用具有新凭据的登录类型的模拟时,被模拟的线程继续充当发送到本地计算机的所有命令的原始用户。它仅在向其他计算机发送命令时充当模拟用户。

这就是为什么我观察到我不需要提供正确的密码:如果我在服务器上有一个宕机的用户,然后我在该服务器上以管理员身份运行客户端应用程序并尝试重新启动它,那么它不会不管我提供什么凭据。模拟线程将继续使用管理员帐户,因为重新启动服务仅涉及与本地计算机交互。我输入的新凭据实际上被忽略了。

顺便说一句,这意味着当我尝试在本地计算机上重新启动服务时,我应该只能输入错误的用户名和密码。当我对此进行更多测试时,这就是我所观察到的。

这就是为什么看起来我不需要担心我输入了哪个密码。我如何访问在 Active Directory 组中没有帐户的计算机呢?根据这篇文章,“NewCredentials LogonType [...] 验证跨域。” 我不确定会发生什么,但看起来新凭据根本没有尝试针对 Active Directory 进行身份验证。我的猜测是,它将模拟凭据直接发送到正在访问的计算机,从而允许模拟本地帐户。

对于我正在处理的项目,这意味着当用户尝试重新启动服务时,我仍然需要向他们询问凭据,但现在他们可以在任何服务器上重新启动服务,即使它没有配置为具有 Active Directory 帐户。

于 2012-07-31T16:14:51.820 回答