我正在开发一个系统,其中各种Windows服务在专用网络中的不同计算机上运行。网络中的任何计算机都可以运行远程与这些服务交互的客户端应用程序。作为我们软件包的一部分,我们的功能可以让用户查看网络中的任何服务是否遇到问题,并重新启动任何已崩溃的服务。
为了实现这一点,我们使用了user impersonation和Service Controller class:我们要求用户在托管已故服务的计算机上提供管理帐户的用户名和密码,冒充该管理员,然后使用ServiceController重新启动服务。这适用于大多数情况,但我们无法冒充我们某些服务器上的管理员。我的理解是,对于用户模拟工作,被模拟的帐户必须位于本地计算机或Active Directory组的一部分,但有问题的服务器只有自己的本地帐户。
我注意到LogonUser
方法有很多参数可以开始模拟并开始玩它们以查看是否有任何一个可以解决我的问题。当我尝试将LogonType值设置为“New Credentials”(9)时,我看到了一些奇怪的(但可能有用的)行为:
为什么我会看到这种行为?如果原因很好,我可能会使用这个设置完全摆脱要求用户完全登录。
答案 0 :(得分:1)
我弄清楚发生了什么:
根据Getting the Current username when impersonated,当使用具有登录类型的新凭据的模拟时,模拟的线程继续充当发送到本地计算机的所有命令的原始用户。它仅在将命令发送到其他计算机时充当模拟用户。
这就是为什么我发现我不需要提供正确的密码:如果我在服务器上有一个被击落的用户,然后我在该服务器上以管理员身份运行客户端应用程序并尝试重新启动它,那么我提供的凭据无关紧要。模拟的线程将继续使用管理员帐户,因为重新启动服务只涉及与本地计算机进行交互。我投入的新凭证实际上被忽略了。
顺便说一句,这意味着当我尝试在本地计算机上重新启动服务时,我应该只能输入错误的用户名和密码。当我对此进行更多测试时,这就是我所观察到的。
这就是为什么看起来我不需要担心我输入的密码。如何访问在Active Directory组中没有帐户的计算机?根据{{3}},“NewCredentials LogonType [...]验证跨域。”我不确定会发生什么,但看起来新凭据根本不会尝试对Active Directory进行身份验证。我的猜测是,它会将模拟的凭据直接发送到正在访问的计算机,允许冒充本地帐户。
对于我正在处理的项目,这意味着我们仍然需要在尝试重新启动服务时询问用户凭据,但现在他们可以在任何服务器上重新启动服务,即使它没有配置为具有Active Directory帐户