5

我有一个用 C# 编写的 Windows 服务。它在调用第 3 方 COM 组件时崩溃。该问题仅出现在 Windows 7(x86 和 x64)上。当我在 Windows 7(x86 和 x64)上运行与控制台应用程序相同的服务代码时,它运行良好。

当我在 Windows 2003 上运行相同的服务时,它也可以正常工作。我认为这可能与UAC有关。我正在寻找有关调试此服务的建议/指导,以确定导致问题的原因。对 ntdll.dll 使用调试符号?在事件日志的信息下方。

Event ID: 1000, Level: Error
Faulting application name: ServiceHost.exe, version: 1.0.0.0, time stamp: 0x4f87bc9a
Faulting module name: ntdll.dll, version: 6.1.7601.17725, time stamp: 0x4ec49b60
Exception code: 0xc0000005
Fault offset: 0x0002bcbb
Faulting process id: 0x151c
Faulting application start time: 0x01cd1939c9017b2d
Faulting application path: E:\ServiceHost\bin\Debug\ServiceHost.exe
Faulting module path: C:\Windows\SYSTEM32\ntdll.dll
Report Id: 08da6aa3-852d-11e1-a889-00155d016f32
4

3 回答 3

7

作为一个疯狂的猜测,你可能会犯Session 0 Isolation

在 Windows XP®、Windows Server® 2003 和早期版本的 Windows® 操作系统中,所有服务都在与登录控制台的第一个用户相同的会话中运行。此会话称为会话 0。在会话 0 中同时运行服务和用户应用程序会带来安全风险,因为服务以提升的特权运行,因此是寻求提升自身特权级别的方法的恶意代理的目标。

这通常会导致服务出现问题,例如,某些东西试图创建 UI。

处理此问题的最简单方法是与第 3 方组件的供应商交谈,并确保它支持与服务一起使用但是,如果供应商不再存在,这可能是不可能的。

如果在服务运行时出现问题,则可以将调试器附加到它并在错误发生时捕获转储(例如,使用 windows 调试工具中的 adplus 之类的东西)。如果问题是在服务启动期间发生的,诊断可能会比较棘手。

确实需要隔离代码中导致错误的最后一个函数调用,然后尝试从那里进行诊断。

于 2012-04-13T06:40:14.203 回答
1

尝试将服务帐户更改为任何其他帐户。喜欢Local System

于 2012-04-13T06:30:00.237 回答
0

第 3 方 COM 组件正在使用一些 hack(一些释放的 API)来提高其性能,并且OS在 Windows 的下一个版本中,界面已更改,恕不另行通知。

这是早期 Windows(Norton,Office ......)的旧策略,用于直接调用内核和......

于 2012-04-13T06:51:26.677 回答