通过注册表设置进程范围安全性

如果要为整个进程设置安全性,一种解决方案是在注册表中设置所需的安全级别。 如果应用程序无法调用 CoInitializeSecurity,或者不想使用编程安全性,这可能是一个不错的选择。 如果决定使用注册表设置进程范围安全性,则应注意,如果在程序 COM 中调用 CoInitializeSecurity,将使用 CoInitializeSecurity 中的值并忽略注册表值。

可通过两种方法在应用程序的注册表中设置安全性:

  • 可以使用 Dcomcnfg.exe,提供用于修改安全值的简单用户界面。 可以使用 Dcomcnfg.exe 配置所有 COM 服务器。 有关详细信息,请参阅 使用 DCOMCNFG 设置进程范围安全性。 但是,除非客户端创建 GUID 并在注册表中输入 GUID,否则客户端应用程序通常不会显示在 Dcomcnfg.exe 中。
  • 可以在应用程序的 AppID 项下设置安全值。 本主题的其余部分介绍如何在注册表中使用 AppID 项设置安全性。

AppID 是一个 GUID,表示一个或多个类的服务器进程。 每个类只与一个 AppID 相关联,并且 AppID 只能分配给 EXE。 DLL 不会获取 AppID,除非它们在代理项中运行,否则是具有 AppID 的代理项进程。 如果将多个 DLL 加载到代理项中,则每个代理项只有一个 AppID。

对于某些 COM 服务器,注册代码将生成 AppID,并将项放置在将 AppID 映射到可执行文件名称的注册表中。 但某些 COM 服务器不提供此功能。 但是,如果服务器的注册代码在运行 dcomcnfg.exe 时为 HKCR\CLSID{ServerCLSID}\LocalServer32 添加项,则会自动为 CLSID 添加 AppID。

对于不是服务器的 COM 客户端,不会创建此映射,因为永远不会注册客户端。 因此,若要使用 AppID 密钥设置安全性,客户端必须通过使用注册表函数或使用 regedit 以编程方式创建必要的注册表项。

如果决定在注册表中的 AppID 密钥下设置进程范围安全性,请注意,AppID 项下可以设置两个命名值,而无需管理员权限:

AuthenticationLevelAccessPermission 值独立设置,具有单独的默认值。 如果 AuthenticationLevel 值不存在,则 LegacyAuthenticationLevel 值将用作默认值。 同样,如果 AccessPermission 值不存在, 则 DefaultAccessPermission 值将用作默认值。 但是, AuthenticationLevelAccessPermission 值以以下方式相互关联:

  • 如果 AuthenticationLevel 为 none,则会为该应用程序忽略 AccessPermissionDefaultAccessPermission 值。
  • 如果 AuthenticationLevel不存在,并且 LegacyAuthenticationLevel 为 none,则会为该应用程序忽略 AccessPermissionDefaultAccessPermission 值。

设置进程范围安全性