繁体   English   中英

如何为我制作服务登录Windows?

[英]How can I make a service logon Windows for me?

我有一个基本的设置要处理,没有域或花哨的东西。 我可以使程序从手机接收消息以触发事件等。

登录之前,C#应用程序如何在后台运行? (我将首先尝试作为服务...)

而且,该程序如何触发Windows登录? 它将是一个个人应用程序,因此我对安全性不太担心。

一些伪代码(是的,我知道这是不安全的):

LogOnWindows(string WindowsUserName, string WindowsPassword)
{
  if (Environment.GetEnvironmentVariable(USERNAME) == null)
  {
    LogonWindows(WindowsUserName, WindowsPassword);
  }
}

我已经签出了Windows的LogOnUser API调用,但这似乎是在后台登录用户...

有许多很好的安全原因,这使得应用程序很难做到这一点。 正如雷蒙德·陈(Raymond Chen)所说,“想象是否有任何应用程序可以做到这一点”。

做到这一点的正确方法(可能比您要处理的麻烦要大得多)是创建GINA替代品。 您可以在此处查看示例。

但是,再次停止,思考和考虑简单陈述“我希望应用程序能够以任何人身份登录而无需用户交互”的含义。 在Windows 9x中这是可能的,并且它是设计上删除的功能。 考虑一下。

如果该服务始终以给定用户身份运行(即,不必根据请求更改用户),则只需在服务的“登录”选项卡中设置指定用户的凭据,而不必担心通过编程方式更改证书。

否则,您需要使用LogonUser API并将令牌从该API传递到新的WindowsIdentity实例,然后对该新身份使用Impersonate方法。 关于这里涉及的内容有一篇很好的文章。

还忘了提及:如果您正在作为服务运行,则使用Environment.GetEnvironmentVariable的方法将不会获取服务用户的信息,而不是交互式用户信息(从技术上讲,取决于操作系统,可能会同时存在多个交互式用户)。

我过去看到的唯一方法是实现类似于VNC的功能,在VNC中,您可以控制来自服务的鼠标和键盘输入。 一个很好的起点是查看UltraVNC源代码或类似内容。 (警告它是用C ++编写的,而不是为了胆小)。

编辑:如果您对非托管代码(C ++或类似代码)感到满意,则可以使用此处发布的建议之一来更轻松地实现。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM