除了作为本地服务器可执行文件(EXE)运行时,COM 对象还可以打包自身,以在本地或远程客户端激活时作为服务应用程序运行。 服务支持许多有用和用户界面集成的管理功能,包括本地和远程启动、停止、暂停和重启,以及建立服务器在特定 用户帐户 和 窗口工作站下运行的能力。
通过在其 AppID 密钥下建立 LocalService 值并执行标准服务安装,安装编写为服务的对象供 COM 使用。
还可以将类配置为在远程客户端激活时在特定用户帐户下运行,而无需编写为服务应用程序。 为此,该类将安装一个用户名和密码,供 SCM 启动其本地服务器进程时使用。
以这种方式配置类时,除非 COM 代表实际激活请求启动进程,否则使用此 CLSID 调用 CoRegisterClassObject 将失败。 换句话说,配置为以特定用户身份运行的类不能在任何其他身份下注册。
用户名取自类的 APPID 密钥下的 RunAs 命名值。 如果用户名为“Interactive User”,则类代码在当前登录用户的安全上下文中运行,并连接到交互式窗口工作站。
否则,将从注册表的隐藏部分检索密码,这些密码仅适用于计算机的管理员和系统。 然后,用户名和密码用于创建运行类代码的登录会话。 以这种方式启动时,类代码使用自己的桌面和窗口工作站运行,因此不会与交互式用户或在其他用户帐户中运行的其他类共享窗口句柄、剪贴板或其他用户界面元素。
使用 LocalService 或 RunAs 注册的服务器可以在正在运行的对象表中注册对象,以允许任何客户端连接到该对象。 为此,服务器对 IRunningObjectTable::Register 的调用必须设置ROTFLAGS_ALLOWANYCLIENT标志。 在设置此位的服务器中,注册表的 AppID 部分必须包含执行文件名称,该名称引用了执行文件的 AppID。 "作为“激活器”服务器(未注册为 LocalService 或 RunAs)可能无法使用此标志注册对象。"
相关主题