使用 CoInitializeSecurity 设置进程范围安全性

借助 CoInitializeSecurity 函数,可以通过以编程方式设置应用程序的安全性来控制复杂的安全方案。 本主题介绍可能使用 CoInitializeSecurity 的方案,并提供有关如何使用的一些详细信息。

出于多种原因,可能希望使用 CoInitializeSecurity 在程序中设置进程范围安全性。 例如,尽管可以使用 dcomcnfg.exe 设置应用程序的身份验证级别和访问权限,但计算机的默认模拟级别可能不是进程所需的模拟级别。 为进程更改此设置的唯一方法是调用 CoInitializeSecurity

如果要使用 Schannel 安全提供程序,则必须在调用 CoInitializeSecurity 时将其指定为身份验证服务。

可能以编程方式设置进程范围安全性的另一个常见方案是,希望为整个进程设置默认安全性,但该进程中有一个或多个对象公开具有特殊安全要求的接口。 在这种情况下,可以调用 CoInitializeSecurity 来设置进程的安全性,使 COM 能够处理大部分安全检查,并且可以调用其他方法来设置具有特殊安全需求的对象的安全性。 在接口代理级别设置安全性中介绍如何调用这些方法和函数。

如果应用程序具有非常具体的安全要求,例如允许某些组访问不同对象,具体取决于一天中的时间,可能希望以编程方式处理所有安全问题,确保 COM 根本不自动检查。 为此,必须调用 CoInitializeSecurity,将 dwAuthnLevel 参数设置为 none,将 pVoid 参数设置为 NULL。 如果有自己的安全包,则还需要在 pAuthnSvc 参数中注册它。 然后,可以通过调用在接口代理级别设置安全性中所述的代理级接口和函数,以编程方式处理自己的所有安全问题。

CoInitializeSecurity 提供一组丰富的功能。 如果调用 CoInitializeSecurity,则忽略注册表值,而使用传入调用的安全初始化值。 根据所需的结果,第一个参数 pVoid 可以指向三种不同类型的值:SECURITY_DESCRIPTORIAccessControl 对象或指向 AppID 的指针。 在大多数情况下,将使用 Windows 函数创建 pVoid 指向的 SECURITY_DESCRIPTOR

但是,pVoid 也可以指向 IAccessControl 对象。

若要向 CoInitializeSecurity 指示正在将 IAccessControl 对象传递给 pVoid,必须将 EOAC_ACCESS_CONTROL 值传递给 dwCapabilities 参数。 由于 CoInitializeSecurity 缓存访问检查的结果,因此在调用 CoInitializeSecurity 后不得更改访问控制列表。

可以传递给 pVoid 参数的另一种类型的值是指向 GUID 的指针,即应用程序的 AppID。 如果 pVoid 是指向 AppID 的指针,则必须在 pCapabilities 参数中指定 EOAC_APPID,以便函数知道 pVoid 中预期的值。 如果 pVoid 指向 AppID,则 CoInitializeSecurity 仅使用注册表获取身份验证值,并忽略 CoInitializeSecurity 的所有其他参数。

设置进程范围安全性