我有用C#编写的Windows服务。 它调用第三方COM组件时会崩溃。 该问题只出现在Windows 7(x86和x64)上。 当我运行与Windows 7(x86和x64)上的控制台应用程序相同的服务代码时,它工作正常。
当我在Windows 2003上运行相同的服务时,它也能正常工作。 我认为这可能与UAC有关。 我正在寻找关于debugging此服务的build议/方向,以确定是什么导致了问题。 使用ntdll.dll的debugging符号? 在事件日志的信息下方。
事件ID:1000,级别:错误
错误应用程序名称:ServiceHost.exe,版本:1.0.0.0,时间戳:0x4f87bc9a
错误模块名称:ntdll.dll,版本:6.1.7601.17725,时间戳:0x4ec49b60
exception代码:0xc0000005
故障偏移量:0x0002bcbb
错误进程ID:0x151c
错误应用程序开始时间:0x01cd1939c9017b2d
错误的应用程序path:E:\ ServiceHost \ bin \ Debug \ ServiceHost.exe
错误模块path:C:\ Windows \ SYSTEM32 \ ntdll.dll
报告ID:08da6aa3-852d-11e1-a889-00155d016f32
疯狂的猜测,你可能会受到Session 0 Isolation的影响 :
在WindowsXP®,Windowsserver®2003及更早版本的Windows®操作系统中,所有服务都与第一个登录到控制台的用户在同一个会话中运行。 此会话称为会话0.在会话0中一起运行服务和用户应用程序会带来安全风险,因为服务以提升的权限运行,因此是寻求提升其自身权限级别的恶意代理程序的目标。
如果这通常会导致服务问题,例如,如果有东西试图创建用户界面。
处理这个问题的最简单的方法是与第三方组件的供应商交谈,并确保它支持与服务一起使用。 但是,如果供应商不再存在,那可能是不可能的。
如果服务运行时出现这个问题,可能会附加一个调试器,并在发生错误的地方捕获一个转储(例如,使用诸如windows调试工具的adplus之类的东西)。 如果在服务启动期间发生问题,诊断可能会更棘手。
你真的需要隔离代码中导致错误的最后一个函数调用,然后尝试从那里进行诊断。
尝试将服务的帐户更改为任何其他帐户。 像Local System
一样。
第三方COM组件正在使用一些黑客(一些不释放的API)来提高其性能,并且在Windows上的下一个版本中, OS
界面已经被改变,恕不另行通知。
这是从早期的Windows(诺顿,办公室…),直接调用内核的旧政策… …