iSecurityProperty::GetOriginalCallerSID 方法 (comsvcs.h)

检索启动调用序列(从中调用当前方法)的基本进程的安全标识符。

获取有关原始调用方的信息的首选方法是使用 ISecurityCallContext 接口。

语法

HRESULT GetOriginalCallerSID(
  [out] PSID *pSID
);

参数

[out] pSID

对启动调用序列(从中调用当前方法)的基本进程的安全 ID 的引用。

返回值

此方法可以返回标准返回值 E_INVALIDARGE_OUTOFMEMORYE_UNEXPECTEDE_FAIL,以及以下值。

返回代码 说明
S_OK
发起对当前对象的调用的基本进程的安全 ID 在参数 pSid 中返回。
CONTEXT_E_NOCONTEXT
当前对象没有与之关联的上下文,因为组件未导入到应用程序中,或者对象不是使用 COM+ CreateInstance 方法之一创建的。

注解

使用 GetOriginalCallerSID 方法可确定发起调用序列的原始进程的安全 ID,从中调用当前方法,而不是进程的发起方 (或创建者) 。 尽管指向对象的指针可以通过一系列服务器和用户传递,但 GetOriginalCallerSID 始终返回进程的第一个服务器和用户,即使该用户不是该对象的原始创建者也是如此。 以下方案演示 GetOriginalCallerSID 方法的功能。

此图显示了在运行两个基本进程的四个服务器之间传递的对象引用的 GetOriginalCallerSID 方法的结果。

  1. 在服务器 A 上以用户 A 身份运行的基本进程 1 在服务器 B 上创建对象 X,以用户 B 身份运行。
  2. 基本进程 1 将其对对象 X 的引用传递给在服务器 D 上运行的基进程 2 作为用户 D。
  3. 基本进程 2 使用该引用来调用对象 X。
  4. 对象 X 调用在服务器 C 上运行的对象 Y。如果 Object Y 随后调用 GetOriginalCallerSID,则返回用户 D 的安全 ID,而不是最初创建该对象的用户 A。
注意 通常,对象的原始调用方与其原始创建者的进程相同。 原始调用方和原始创建者不同的唯一情况是,原始创建者将引用传递给另一个进程,另一个进程启动调用序列 (,如前面的示例) 所示。
 
如果链上的任何对象是通过 IObjectContext::CreateInstance 或 ITransactionContext::CreateInstance 以外的某种方式创建的,则原始调用方的路径将断开。 例如,如果基本进程 1 使用 CoCreateInstance 创建对象 X,当对象 Y 调用 GetOriginalCallerSID 时,它返回的安全 ID 是用户 B 的安全 ID,而不是用户 D 的安全 ID。这是因为调用序列通过对象的上下文进行跟踪,并且 COM+ 只能为使用 IObjectContext::CreateInstanceITransactionContext::CreateInstance 创建的对象创建上下文。

使用完安全 ID 后,必须对安全 ID 调用 ReleaseSID

要求

要求
最低受支持的客户端 Windows 2000 Professional [仅限桌面应用]
最低受支持的服务器 Windows 2000 Server [仅限桌面应用]
目标平台 Windows
标头 comsvcs.h

另请参阅

ISecurityProperty