我被要求写一个C#应用程序在Windows 7机器上运行,以显示一天中的时间,天气等。我能做到。我正在寻找的是在没有以用户身份登录的情况下在Windows7计算机上运行应用程序的指导。从本质上讲,机器只是一个带屏幕的CPU。没有键盘或鼠标。我已经看到使用服务ID在MS-PixelSense(用于MS-Surface)上完成的部署。
如果我需要登录,用户政策启动,屏幕保护程序启用等。我假设我使用自动服务ID,我可以让应用程序覆盖大部分设置,保持屏幕打开和分配/锁定到服务ID所需的权限 任何信息/建议都表示赞赏....
答案 0 :(得分:1)
首先,一些背景信息:
访问网络共享
如果客户端上运行的进程想要访问(CIFS)共享,则必须在具有此共享访问权限的用户帐户(或"服务ID")下运行。有一种方法(如果客户端是Active Directory的成员),必须在ACL(共享/ NTFS)中输入附加了$(实际上是AD中的计算机帐户名称)的计算机名称,但这是不是很平常"方式。
另见https://serverfault.com/questions/41130/network-service-account-accessing-a-folder-share
在用户帐户(即技术帐户或服务ID)下运行的Windows服务
在用户帐户下运行的服务无法访问GUI。有一些技巧,几年前我写了一个工具,允许服务启动另一个GUI程序,其中GUI显示在Ctrl-Alt-Del对话框上方。但这不再适用于Windows 7。 但即使是在本地系统下运行的服务也无法在登录屏幕上显示GUI。 您必须编写凭证提供程序。
见
Windows service showing a GUI when no user is logged in
https://stackoverflow.com/a/3074040/4547223
另一篇非常深刻的技术文章。它表示可以在安全桌面/登录屏幕上显示GUI。我自己还没有测试过这个:
http://calebdelnay.com/blog/2012/01/displaying-a-program-on-the-windows-secure-desktop
<强>自动登录强>
最着名的方式仍然是&#34;经典&#34;自动登录。
有关解释和链接,请参阅https://security.stackexchange.com/questions/10170/how-secure-is-windows-auto-logon。 中等安全的方法是将密码存储为LSA密码(可以使用P / Invoke或某些工具在C#中完成)。
如果我需要登录,用户政策启动,屏幕保护程序启用等
是的,但是这可以处理,您可能必须创建一个自己的AD OU,并为此创建自己的策略。
我假设我使用自动服务ID,我可以让应用程序覆盖大部分设置,保持屏幕开启,并将所需权限分配/锁定到服务ID。
服务ID /技术帐户与普通的个人用户帐户基本相同。 在某些Active Directory企业环境中,技术帐户具有无法以交互方式登录和其他限制的限制。但它仍然是一个&#34;用户帐户&#34;
Logonexpert(http://www.logonexpert.com/)
我测试了这个(试用版)。这是一个很好的小工具,可以完成它的工作。它比正常的自动记录更安全,但最终,它与普通的经典自动记录没有多大区别。一个好处是:它更加隐蔽地存储密码,但理论上,一些黑客仍然可以反编译程序并找到解密它的方法。对您来说更重要的是:除了更安全的密码存储之外,它并没有带来太多帮助。您仍然拥有与普通自动登录相同的用户登录信息。
一些建议
您可以在客户端系统上使用本地用户帐户并使用常规自动登录机制。然后,您应该考虑客户端系统不会轮询网络共享上的新数据,而是将另一个服务器程序(作为服务实现,在技术域帐户下运行)推送客户端上的网络共享上的数据。
这样做,客户端代码不需要访问网络共享,其好处是,恶意攻击者也无法访问网络共享。
如果您确实需要从本地用户上下文访问网络共享,您可以登录到服务器,如我在此处的回答中所述:
https://stackoverflow.com/a/28749093/4547223
您必须通过访问CIFS共享来更改注册表代码部分。
但是这样做,你再次拥有一个密码,你必须加密和存储。我不推荐这个。
最终......
Windows并不能让您轻松实现目标。如果您没有严格绑定到Windows,则可以考虑使用Raspberry Pi和Raspbian(Debian派生的Linux)。您可以安装Chromium浏览器,它在服务器上显示网页并自动更新。我们在一段时间内取得了巨大的成功。