中国服务器网

服务器问题集锦,包括 Linux(Ubuntu, Centos,Debian等)和Windows Server服务器

Win32:如何根据Active Directoryvalidation凭据?

它已被问及 .NET的答案,但现在是时候得到本机Win32代码的答案: 我如何validationWindows用户名和密码? 我之前问过这个问题的托pipe代码 。 现在是本地解决scheme的时候了。 它需要指出一些更常见的解决scheme的陷阱: 无效的方法1.使用模拟查询Active Directory 很多人build议查询Active Directory的东西。 如果抛出exception,那么你知道凭据是无效的 – 正如在这个stackoverflow问题中所build议的。 然而,这种方法有一些严重的缺陷 : 您不仅要validation域帐户,还要进行隐式授权检查。 也就是说,您正在使用模拟令牌从AD读取属性。 如果否则有效的帐户没有权利从AD读取? 默认情况下,所有用户都具有读取访问权限,但可以将域策略设置为禁用受限帐户(和/或组)的访问权限。 针对AD的绑定具有严重开销,AD架构caching必须在客户端(DirectoryServices使用的ADSI提供程序中的ADSIcaching)中加载。 这既是networking,又是AD服务器,消耗资源,而且对于像validation用户帐户这样的简单操作来说太昂贵了。 对于非例外情况,您依赖exception失败,并假设这意味着无效的用户名和密码。 其他问题(如networking故障,AD连接故障,内存分配错误等)则被误解为authentication失败。 .NET的DirectoryEntry类的使用是validation凭据的不正确方法的一个例子: 无效的方法1a – .NET DirectoryEntry entry = new DirectoryEntry("persuis", "iboyd", "Tr0ub4dor&3"); object nativeObject = entry.NativeObject; 无效的方法1b – .NET#2 public static Boolean CheckADUserCredentials(String accountName, String password, String domain) { Boolean result; using […]

Delphi Windows服务devise

Delphi Windows服务devise 我从来没有创build一个Windows服务,但一直在读我find的一切。 我所遇到的所有文章或例子都是非常基础的,并且在范围上是有限的。 没有看到任何超越这个或那个特定场景的东西。 所以,我有可能find的所有理论,现在我准备好深入这个项目。 我喜欢布置我的想法,并获得一些人们的想法反馈。 我将从应用程序描述我需要的内容,以及我打算如何构build它。 我会感谢任何有经验的build筑窗口服务和任何意见,他们会分享的意见。 [场景]现在我有一个应用程序(我将称之为UPDATEAPPLICATION),提供所有其他应用程序的更新。 为了运行我们的任何应用程序,您首先必须运行此UPDATEAPPLICATION程序并将其传递给所需应用程序的参数。 UPDATEAPPLICATION调用返回XML信息的WebService,以确定所需的应用程序是否有更新。 如果有更新,则UPDATEAPPLICATION以EXE或ZIP格式下载更新,并replace相应的文件以更新目标应用程序。 之后,UPDATEAPPLICATION执行ShellExecute来启动所需的应用程序,然后closuresUPDATEAPPLICATION。 这是一个相当基本的过程,多年来运作良好。 UPDATEAPPLICATION程序是一个Delphi应用程序,我们的其他应用程序混合:Delphi,VB6,MS Access,.NET。 [问题]随着Vista和Windows 7的转移,安全性发生了巨大的变化。 由于UPDATEAPPLICATION的性质,UAC将不允许应用程序在没有pipe理权限或UAC完全closures的情况下运行。 我们正在将许多应用程序升级到.NET,在此过程中,我希望应用程序以及UPDATEAPPLICATION符合UAC标准。 从我研究过的唯一方法是通过创buildUPDATEAPPLICATION作为Windows服务。 所以,实质上,我需要将UPDATEAPPLICATION的function复制到Windows Service体系结构中。 [我的devise]我正在使用DelphiXE2。 我的devise将由三部分组成,形成一个单一的解决scheme:一个Windows服务,一个小的托盘应用程序与Windows服务进行交互,我的重新devise的应用程序将发送消息到Windows服务。 我的Windows服务(我将调用UPDATESERVICE)将作为Windows服务运行,并创build一个TCP服务器来侦听请求。 托盘应用程序(我将调用TRAYAPP)将使用TCP客户端来configuration/pipe理UPDATESERVICE。 我的USERAPPLICATION,启动时,将发送一个TCP消息到UPDATESERVICE,说“这个应用程序”已经启动。 [UPDATESERVICE]将听取消息。 如果收到USERAPPLICATION已经启动的消息,它将调用Web服务来查看是否有更新。 如果有,则会通知用户closures应用程序,并允许UPDATESERVICE更新应用程序。 UPDATESERVICE将下载适当的文件并更新应用程序。 现在我已经解释了我想要做的事情的基本知识,我可以问我需要回答的具体问题。 这些都与我应该如何build立我的Windows服务有关。 我也计划使用OmniThread进行我的线程pipe理。 当我的服务启动时,我需要创buildTCP服务器。 TCP服务是否应该在自己的线程上创build? 如果TCP服务是它自己的线程,我该如何保持线程活着? 否则,我可以启动TCP服务,但是我不确定在TCP服务单元中使用什么代码来保持线程运行? 什么Windows服务事件应该创buildTCP服务? OnExecute? 的OnStart? 在OnCreate? 毕竟我已经读了不清楚应该使用什么事件。 当TCP服务收到消息做某事时,应该在TCP服务线程中执行工作还是在主要的UPDATESERVICE产生一个新的线程? 例如: 如果TCP服务获取消息来检查使用HTTP的更新,TCP服务线程产生一个新线程来完成这项工作 或者,如果TCP服务线程向UPDATESERVICE发送消息以产生一个新的线程来完成这项工作 它甚至重要吗? 在Delphi代码中可以启动/停止/注册/取消注册Windows服务吗? 这是我所有的问题。 这可能不是一个正确/错误的答案,而只是基于经验的偏好。 如果你用Delphi构build了服务,你可能会有一些我认为有用的东西。 如果你有一个更健壮的项目,那么一个基本的“开始一个服务和睡眠”,并愿意分享它 […]