为什么某些Win32技术在Windows NT服务中行为不当?
弗兰克·金
服务是具有特殊要求的后台Win32进程。它需要一个独特的入口点和一个回调函数。回调函数被称为服务控制处理程序。新的入口点通常称为ServiceMain,但您可以任意命名。 |
本文假定您熟悉Win32 |
Frank Kim是微软专门从事内核/基础技术的支持工程师。他喜欢花空闲时间玩股票市场。他可以通过franki@microsoft.com联系到他。 |
四年前, 我被介绍给Windows NT® 服务。像许多其他程序员一样,我发现它们都很有趣,也很奇怪。不像的Windows ® 为基础的应用程序,服务通常没有任何直接的用户交互。开发人员经常告诉我,某些代码可以在基于Windows的应用程序中运行,但不能从他们的服务中运行。主要问题是对“环境”差异缺乏了解。服务的“环境”或Outlook与用户发起的基于Windows或控制台应用程序的“环境”有很大的不同。我所说的“环境”指的不仅是过程的环境变量,您还必须包括窗口站点和桌面,注册表配置单元, 许多的Win32 ® 技术,如MFC,ODBC和MAPI,可以表现不同的服务,由于在服务的差异“的环境。” 让我们来探讨一下为什么这些不同的技术在服务中显得不合时宜。 在我解释“环境”差异之前,让我们仔细看看服务是什么。服务是具有特殊要求的后台Win32进程。它需要一个独特的入口点和一个回调函数。回调函数被称为服务控制处理程序。新的入口点通常称为ServiceMain,但是您可以通过SERVICE_TABLE_ENTRY结构中的LPSERVICE_MAIN_FUNCTION成员命名它。 |
typedef struct _SERVICE_TABLE_ENTRY {// steLPTSTR lpServiceName;LPSERVICE_MAIN_FUNCTION lpServiceProc;} SERVICE_TABLE_ENTRY,*LPSERVICE_TABLE_ENTRY; |
The service is manipulated (installed, started, stopped, and configured) through a subset of the Win32 API. You can pass a server name to manipulate services remotely over a network. A service can be configured to run in either a specific user account or the LocalSystem account (see Figure 1). Either account is referred to as the service account. A service can be configured to start running when the system is first booted or at the discretion of a user with the proper security. |
Figure 1 Configuring a Service |
Since a service is a background process, it can continue to run when there are no interactively logged-on users. Services are usually not directly manipulated by the interactive user. (I'll go over some of the exceptions later.) They are intended to be background processes processing data or offering services on a Windows NT server locked in a closet somewhere. This means that a service should not display dialog boxes to prompt users for input. It should not display information on the system tray. It shouldn't send messages to a user-launched application.
For further information, please refer to the Platform SDK documentation and "Design a Windows NT service to Exploit Special Operating System Facilities," by Jeffrey Richter (MSJ, October 1997). |
Figure 2 Logon Dialog |
I wanted to make this very clear since you can technically have other processes running in different security contexts that can be considered interactive. In addition to the differences, I will point out some items you should consider when designing a service and the solutions to the problems caused by the environmental differences. Windows NT Security |
Figure 3 Security Components |
当然,Windows NT安全性是开发人员遇到的第一个主要的环境差异。许多Win32 API包含SECURITY_ ATTRIBUTES参数,例如CreateDesktop,CreateDirectory,CreateDirectoryEx,CreateEvent,CreateFile,CreateFileMapping和CreateMailSlot。 |
typedef struct _SECURITY_ATTRIBUTES {// saDWORD nLength;LPVOID lpSecurityDescriptor;BOOL bInheritHandle;} SECURITY_ATTRIBUTES; |
对于大多数开发人员来说,传递NULL参数就足够了。只要操作安全对象的所有进程都在相同的安全上下文中运行,就没有问题。 在Windows NT服务中,此技术可能会或可能不会工作。服务帐户允许服务以不同的用户身份运行。如果您曾经查看过安装在Windows NT计算机上的服务,则知道其中大部分都是为系统帐户(也称为LocalSystem帐户)配置的。系统帐户是仅在您的计算机上本地识别的特殊帐户。这意味着此帐户不能用于访问依赖NT LAN Manager(NTLM)身份验证的网络资源。这些资源包括文件共享,命名管道,注册表以及对远程计算机事件日志或服务控制管理器的访问。为什么这不可能? NTLM身份验证基于包含用户名和密码的加密凭据。如果操作系统遇到没有任何凭据的用户,则用户被认为具有NULL凭证。当系统尝试访问基于NULL凭证的安全网络资源时,这被称为NULL会话。只有当远程机器允许NULL会话访问时才允许访问。这可以通过注册表来配置。(有关详细信息,请参阅知识库文章Q122702。)唯一的其他解决方法是使用有效凭据模拟用户或使用可访问安全网络资源的服务帐户。Winsock和NetBIOS不是安全的NTLM资源,所以它们不会遇到上述安全限制。 这似乎是一个主要问题。那么为什么配置这么多的服务来使用本地系统帐户呢?本地系统帐户被授予在操作系统上可用的所有权限。权限允许用户操纵各种系统资源,例如更改系统时间,交互式登录和从远程系统关闭(参见图4)。 |
图4用户管理器授予权限 |
权限是相对于本地机器授予的。这意味着域帐户必须被授予本地机器本身的权限,而不是域控制器上的权限。例如,如果属于Redmond域的用户Fester登录到计算机A和B,则每台计算机都需要向Redmond \ Fester授予“本地登录”权限,以便Fester以交互方式登录到两台计算机。特权的一个令人困惑的方面是它们有一个关联的属性,指示它们是启用还是禁用。某些Win32 API需要用户拥有该权限并且有权限才能成功使用API。您可以考虑启用特权作为安全开关。例如,LogonUser API需要“充当操作系统的一部分”。程序员不需要启用这个特权。这个API支持你。 窗口站和桌面 |
图6 Window Station和台式机 |
在Windows NT 4.0上,只有一个窗口站点可见,WinSta0。可视窗口站也被定义为交互式。一个不可见的窗口站是非交互的。一个不可见的窗口站没有收到任何用户输入,也没有显示设备与之关联。 |
图7交互式流程与服务 |
你也可以通过STARTUPINFO结构的lpDesktop成员来指定你希望你的进程与哪个窗口工作站和桌面相关联(见图8)。这个结构被传递给CreateProcess和CreateProcessAsUser。您可以将lpDesktop初始化为NULL,这将指示CreateProcess使用调用进程使用的同一个窗口工作站和桌面。您可以指定您自己的窗口工作站和桌面组合,例如“WinSta0 \ Default”,或者您可以传入一个空字符串。这指示操作系统为启动的进程创建一个新的不可见窗口站和桌面。与新对象关联的安全性授予Everyone组对这两个对象的完全访问权限。
WinSta0 \ Default与在LocalSystem帐户中运行的服务关联,并与桌面进行交互。(ServiceType必须包含SERVICE_INTERACTIVE_PROCESS标志。)如果服务不与桌面进行交互,它将与Service-0x0-3e7 $ \ Default关联。这是一个不可见的窗口站。如果您想知道0x0-3e7 $是什么,它就是服务的登录SID。登录SID对于此特定的登录会话是唯一的。它指的是用户所属的组。系统上的所有用户都将具有登录SID。上面的最终选择是基于服务帐户登录SID的服务的不可见窗口站。 |
图9 Regedt32.exe |
HKEY_USER \用户的SID和HKEY_CURRENT_USER的子项将完全相同。当应用程序引用HKEY_CURRENT_USER时,系统会根据用户的安全上下文将用户映射到正确的配置单元。这将包含用户的SID,然后用于在HKEY_USERS下找到正确的配置单元。如果由于某种原因没有加载用户的配置单元,系统会将用户的配置单元映射到.DEFAULT。用户配置单元加载的唯一时间是服务帐户或交互式用户。如果服务器应用程序模拟客户端,然后将注册表引用到HKEY_CURRENT_USER,则用户的配置单元将映射到.DEFAULT。系统将尝试根据其SID来查找用户的配置单元。如果在HKEY_USERS下找不到该配置单元,系统会将用户的配置单元映射到.DEFAULT。 包起来 |
https://www.microsoft.com/msj/0398/service2.aspx
为什么某些Win32技术在Windows NT服务中行为不当?相关推荐
- 在中国Windows Azure服务中创建应用程序的一些不同之处
Azure 中的托管服务由一个应用程序(用于在托管服务中运行)和 XML 配置文件(定义托管服务的运行方式)组成.托管服务同时使用服务定义文件 (.csdef) 和配置文件 (.cscfg).有关详细 ...
- windows的服务中的登录身份本地系统账户、本地服务账户和网络服务账户修改
以一个redis服务为例: 一个redis注册服务后一般是网络服务账户,但是当系统不存在网络服务账户时,就会导致redis服务无法正常启动.接下来修改redis服务的登录身份. cmd下输入如下命令: ...
- [转载]深入Windows NT/2000模块的组织 - 专题安全方向{ Security Research Papers } - 邪恶八进制信息安全团队技术讨论组 努力为祖国的信息安全撑起一片蓝天
导读: [转载]深入Windows NT/2000模块的组织 文章作者:WebCrazy 信息来源:WebCrazy( http://www.geocities.jp/webcrazyjp/) 深入W ...
- [转帖]windows7/windows NT介绍
windows7/windows NT介绍 原文应该是IT168发布的 但是一直没找到 感觉看了之后 明白了很多 技术都是互相融合的 没有严格意义上的对立直说. Windows 7/Windows S ...
- 系统配置microsoft服务器,Windows 评估服务设置和配置
Windows 评估服务设置和配置 05/05/2017 本文内容 本主题中的部分介绍如何设置和配置 Windows 评估服务. 初始化 Windows 评估服务 若要初始化 Windows 评估服务 ...
- Windows NT 4.0
下载 第23章Windows NT 4.0 作者:Kurt Hudson 本章内容包括: • Windows NT版本 • 体系结构 • 安装Windows NT 4.0 • 配置T C P / I ...
- 使用Windows NT 的安全性(转)
使用Windows NT 的安全性: 在上一节,我们已经阐述了推荐使用Windows NT做Web服务器的一些理由,其最重要的一点是,能够使用Windows NT的安全性API.然而,懂得为什么要存在 ...
- C# Windows Service服务开发的简单实现(Topshelf)
概念:(Copyed From 百科) Windows服务是指Windows NT操作系统中的一种运行在后台的计算机程序.它在概念上类似于Unix守护进程.Windows服务必须匹配服务控制管理器(负 ...
- Windows系统回顾之Windows NT
在Windows3.X的成功之后,Microsoft开始将操作系统的发展分为两线,其中一个是Windows 3.X的下一代产品Windows95,另一个则是全新的操作系统Windows NT.在Win ...
最新文章
- cocos2dx在eclipse环境下集成ucsdk
- DataFrame的copy的用法
- 购物商城---购物车,结算
- java 实现雷达图,如何使用y轴为0到100的chart.js创建雷达图?
- 优化我们的业务之Timecard
- java之 代理设计模式
- 2020年12月大学英语四六级英语作文预测(XDF王江涛)
- 今天小暑是什么时间_小暑适合发朋友圈的说说 小暑吐槽天气热的搞笑幽默说说...
- [kubernetes] 资源管理 --- 资源预留实践
- Using LogMiner
- matlab file(i).name,求大佬帮忙备注一下,有点看不懂,详细一点
- 洛达项目AB152xP资料SDK相关说明
- 苹果手机升级13无法开机_苹果11更新ios13.7卡在开机页面
- 数据分析:数据处理篇1
- 什么是最容易涨粉的短视频,拍什么短视频最吸粉
- OTG – Android USB Hos
- 图钉能按到墙上吗_像图钉一样把纸按在墙上的东西叫什么
- oracle--13集合
- Python3中关于下划线变量和命名的总结
- 合宙Air103|fbd数据库| fskv - 替代fdb库|LuatOS-SOC接口|官方demo|学习(16):类redis的fbd数据库及fskv库
热门文章
- docker使用文档1
- framework层加了打印信息打印intent传递的数据,报错:ActivityManager: Activity Manager Crash. UID:10074 PID:7444 TRANS:3
- C语言-输出* 图形 ** *** **** *****
- 安防视频流媒体服务器Easy NVR搭建之DASH直播平台的搭建需要具备哪些条件?
- 第十四届蓝桥杯(Web 应用开发)模拟赛 1 期-大学组-线上模拟赛-第一题-数据类型检测
- 一入职就遇上Mysql亿级优化,方案都改了5遍
- 【JAVA】500勇士问题,杀掉第三个人
- powerCenter介绍
- 诗歌二 未知来生相见否,陌上逢却在少年。
- STL教程:C++ STL快速入门