2023年12月20日发(作者:)

远程过程调用rpc协议出错

篇一:远程过程调用 RPC

远程过程调用RPC

一、概述

在传统的编程概念中,过程是由程序员在本地编译完成,并只能局限在本地运行的一段代码,也即其主程序和过程之间的运行关系是本地调用关系。因此这 种结构在网络日益发展的今天已无法适应实际需求。总而言之,传统过程调用模式无法充分利用网络上其他主机的资源(如CPU、Memory等),也无法提高 代码在实体间的共享程度,使得主机资源大量浪费。

而本文要介绍的RPC编程,正是很好地解决了传统过程所存在的一系列弊端。通过RPC我们可以充分利用非共享内存的多处理器环境(例如通过局域网 连接的多台工作站),这样可以简便地将你的应用分布在多台工作站上,应用程序就像运行在一个多处理器的计算机上一样。你可以方便的实现过程代码共享,提高 系统资源的利用率,也可以将以大量数值处理的操作放在处理能力较强的系统上运行,从 1

而减轻前端机的负担。

二、RPC的结构原理及其调用机制

如前所述RPC其实也是一种C/S的编程模式,有点类似C/S Socket 编程模式,但要比它更高一层。当我们在建立RPC服务以后,客户端的调用参数通过底层的RPC传输通道,可以是UDP,也可以是TCP(也即TI-RPC —无关性传输),并根据传输前所提供的目的地址及RPC上层应用程序号转至相应的RPC Application Porgramme Server ,且此时的客户端处于等待状态,直至收到应答或Time Out超时信号。具体的流程图如图1。当服务器端获得了请求消息,则会根据注册RPC时告诉RPC系统的例程入口地址,执行相应的操作,并将结果返回至客 户端。

图1

当一次RPC调用结束后,相应线程发送相应的信号,客户端程序才会继续运行。

当然,一台服务主机上可以有多个远程过程提供服务,那么如何来表示一个唯一存在的远程过程呢?一个远程过程是有三个要素来唯一确定的:程序号、版本号和过程号。程序号是用来区别一组相关的并且具有唯一过程号的远程过程。一个程序可以有一个或几个不同的版本,而每个版本的程序都包含一系列能被远程调 用的过程,通过版本的引入,使得不同版本下的RPC能同时提供服务。每个版本都 2

包含有许多可供远程调用的过程,每个过程则有其唯一标示的过程号。

三、基于RPC的应用系统开发

通过以上对RPC原理的简介后,我们再来继续讨论如何来开发基于RPC的应用系统。一般而言在开发RPC时,我们通常分为三个步骤:

a、定义说明客户/服务器的通信协议。

这里所说的通信协议是指定义服务过程的名称、调用参数的数据类型和返回参数的数据类型,还包括底层传输类型(可以是UDP或TCP),当然也可以 由RPC底层函数自动选择连接类型建立TI-RPC。最简单的协议生成的方法是采用协议编译工具,常用的有Rpcgen,我会在后面实例中详细描述其使用 方法。

b、开发客户端程序。

c、开发服务器端程序。

开发客户端和服务器端的程序时,RPC提供了我们不同层次的开发例程调用接口。不同层次的接口提供了对RPC不同程度控制。一般可分为5个等级的编程接口,接下来我们分别讨论一下各层所提供的功能函数。

1、简单层例程

简单层是面向普通RPC应用,为了快速开发RPC应用服务而设计的,他提供了如下功能函数。

3

函数名

功能描述

Rpc_reg( )

在一特定类型的传输层上注册某个过程,来作为提供服务的RPC程序

Rpc_call( )

远程调用在指定主机上指定的过程

Rpc_Broadcast( )

向指定类型的所有传输端口上广播一个远程过程调用请求

2、高层例程

在这一层,程序需要在发出调用请求前先创建一个客户端句柄,或是在侦听请求前先建立一个服务器端句柄。程序在该层可以自由的将自己的应用绑在所有的传输端口上,它提供了如下功能函数。

函数名

功能描述

Clnt_create( )

程序通过这个功能调用,告诉底层RPC服务器的位置及其传输类型

Clnt_create_timed( )

定义每次尝试连接的超时最大时间

4

Svc_create( )

在指定类型的传输端口上建立服务器句柄,告诉底层RPC事件过程的相应入口地址

Clnt_call()

向服务器端发出一个RPC调用请求

3、中间层例程

中间层向程序提供更为详细的RPC控制接口,而这一层的代码变得更为复杂,但运行也更为有效,它提供了如下功能函数。

函数名

功能描述

Clnt_tp_create( )

在指定的传输端口上建立客户端句柄

Clnt_tp_create_timed( )

定义最大传输时延

Svc_tp_creaet( )

在指定的传输端口上建立服务句柄

Clnt_call( )

向服务器端发出RPC调用请求

4、专家层例程

这层提供了更多的一系列与传输相关的功能调用,它提供了如下功能函数。 函数名

5

功能描述

Clnt_tli_create( )

在指定的传输端口上建立客户端句柄

Svc_tli_create( )

在指定的传输端口上建立服务句柄

Rpcb_set( )

通过调用rpcbind将RPC服务和网络地址做映射

Rpcb_unset( )

删除rpcb_set( ) 所建的映射关系

Rpcb_getaddr( )

调用rpcbind来返回指定RPC服务所对应的传输地址

Svc_reg( )

将指定的程序和版本号与相应的时间例程建起关联

Svc_ureg( )

删除有svc_reg( ) 所建的关联

Clnt_call( )

客户端向指定的服务器端发起RPC请求

5、底层例程

该层提供了所有对传输选项进行控制的调用接口,它提供了如下功能函数。 函数名

功能描述

Clnt_dg_create( )

6

采用无连接方式向远程过程在客户端建立客户句柄

Svc_dg_create( )

采用无连接方式建立服务句柄

Clnt_vc_create( )

采用面向连接的方式建立客户句柄

Svc_vc_create( )

采用面向连接的方式建立RPC服务句柄

Clnt_call( )

客户端向服务器端发送调用请求

四、 实例介绍

以下我将通过实例向读者介绍通过简单层RPC的实现方法。通常在此过程中我们将使用RPC协议编译工具—Rpcgen。Rpcgen 工具用来生成远程程序接口模块,它将以RPC语言书写的源代码进行编译,Rpc 语言在结构和语法上同C语言相似。由Rpcgen 编译生成的C源程序可以直接用C编译器进行编译,因此整个编译工作将分为两个部分。Rpcgen的源程序以.x结尾,通过其编译将生成如下文件:

a) 一个头文件(.h)包括服务器和客户端程序变量、常量、类型等说明。 b) 一系列的XDR例程,它可以对头文件中定义的数据类型进行处理。 c) 一个Server 端的标准程序框架。

7

d) 一个Client 端的标准程序框架。

当然,这些输出可以是选择性的,Rpcgen 的编译选项说明如下: 选项

功能

- a

生成所有的模板文件

- Sc

生成客户端的模板文件

- Ss

生成服务器端的模板文件

- Sm

生成Makefile 文件

(详见Solaris Rpcgen Manaul)

Rpcgen 源程序 time.x:

/* time.x: Remote time printing protocol */

program TIMEPROG {

version PRINTIMEVERS {

string PRINTIME(string) = 1;

} = 1;

} = 0x20000001;

time_proc.c源程序:

/* time_proc.c: implementation of the remote procedure

8

printime */ #include

#include /* always needed */

#include time.h /* time.h will be generated by rpcgen */

#include

/* Remote version of printime */

char ** printime_1(char **msg,struct svc_req *req)

{

static char * result; /* must be static! */

static char tmp_char[100];

time_t rawtime;

FILE *f;

f = fopen(/tmp/rpc_result, a+);

if (f == (FILE *)NULL) {

strcpy(tmp_char,Error);

result = tmp_char;;

return (&result);

}

fprintf(f, %sn, *msg); //used for debugging

fclose(f);

time(&rawtime);

sprintf(tmp_char,Current

is :%s,ctime(&rawtime)); result =tmp_char;

9

time

return (&result);

}

篇二:RPC协议两个规范

RPC协议2:这个协议是一个够年头的协议

本文介绍用于ONC RPC协议规范。此协议使用XDR语言进行描述,并文不打算描述具体的使用细节而只介绍RPC协议本身。

ONC RPC是基于RPC调用模型,此模型和本地过程调用(LPC)类似。对于LPC而言,调用方只需要将参加放入一些固定的地址,如寄存器,然后将程序的控制权转交给另一个程序,最后再由那个程序返回即可。RCP与之类似,RCP在调用一个远程过程后,自己进行等待状态,传往远程过程的参数包括过程参数,返回参数包括执行结果。当收到包括执行结果的消息后,本地进程从消息中取得结果,调用进程重新开始执行。在服务器一方,有一个程序在等待调用,当有一个调用到达时,服务器进程取得进程参数,计算结果,然后返回结果。

在上面的模型中,在某一个时刻只有一个进程是活动的。ONC RCP没有规定如何处理并发。调用可以同步的也可以是异步的。服务器可以创建一个线程来接收用户请求,也可以自己来接收用户请求。下面是RCP不同于LPC的几点:

10

1. 错误处理:对于远程服务器和网络失败必须进行处理;

2. 全局变量:因为远程服务不可能访问本地的变量,因此不能传送全局变量;

3. 性能:RPC通常比LPC要慢许多;

4. 认证:因为RPC通常要经过网络,因此必须进行认证。

虽然有现成的工具可以自动生成相关的服务器和客户方,但是协议本身仍然需要仔细设计。

RPC可由不同的传输协议实现,但RPC依然需要获得传输层的信息(这一过程本文不涉及)。这是因为有时候,传输层会限制信息的长度,同时通信双方必须遵守同一个通信协议。RPC不会试图实现任何可靠性,应用程序应该注意相关的可靠性问题。如果RPC在TCP上运行,一切好说。TCP代替应用程序做一些工作,但如果RPC运行在UDP上,应用程序必须注意超时,重传,多次请求检查等工作。因为传输是独立的,因此RPC必须从相关的传输层上获得是否正确执行的信息。对于UDP来讲,如果应用程序没有得到响应,它必须重新请求;重新请求后得到响应,应用程序只能推断出服务器至少执行了一次请求。通过对请求加上编号,可以使得服务器不对重复的请求加以响应。因此我们可以确定在收到确定后,服务器至多执行了一次请求。这里 11

需要注意的一点是:客户的请求的ID号只能用于和服务器内的ID号进行相等比较,不能进行其它操作。

即使使用了TCP,在没有得到响应时,我们也不能确定服务器是不是一定执行了相关的操作。我们还需要使用超时机制以保证服务器没有失败。RPC可以使用其它的协议,如VMTP。但本文中我们以TCP作为例子。RPC协议本身不包括绑定,这是由高层协议来完成的。RPC必须提供:

1. 被调用过程必须是唯一的;

2. 必须提供调用消息和响应消息的配对机制;

3. 必须提供认证机制;

除上面的要求外还必须提供对下面问题的检测机制:

1. RPC不匹配;

2. 版本号不匹配;

3. 协议错误,如参数错误;

4. 必须提供认证错误的原因;

5. 提供其它错误信息。

RCP调用有三个无符号整数域:远程程序号,程序版本号和远程过程号。程序号必须统一管理 (***********)。在拥有一个程序号后,我们就可以实现自己的远程程序了。第一个实现通常以版本1来标记,这个版本号用于标记我们应该使用何种版本的程序。过程号用于标记被调用的程序。RCP本身可以变化,RCP消息协议也可以变化。因此消息 12

本身也有RPC版本号,它通常和这里描述的两个版本号之一一致。返回消息必须提供信息以足以确定下面错误:

1. 远程实现不支持版本2,返回可以支持的最高和最低版本号;

2. 远程程序在远程机上不可用;

3. 远程程序不支持请求的版本号,返回支持的最高和最低版本号;

4. 请求的过程不存在;

5. 参数错误

认证机制要求请求消息有两个认证域:证书和确认。响应消息有一个域:响应确认。RPC对这三个域统一定义如下:

enum auth_flavor {

AUTH_NONE = 0,

AUTH_SYS = 1,

AUTH_SHORT = 2

/* and more to be defined */

};

struct opaque_auth {

auth_flavor flavor;

opaque body<400;

};

对于认证结构语义的解释不在本协议规定之列。如果认 13

证失败,必须提供失败原因。程序号成组给出,下面是一些规定:

0 - 1fffffff 由***********定义

20000000 - 3fffffff 用户定义

40000000 - 5fffffff 临时

60000000 - 7fffffff reserved

80000000 - 9fffffff reserved

a0000000 - bfffffff reserved

c0000000 - dfffffff reserved

e0000000 - ffffffff reserved

其中第一组中要求的号码要求所有的RPC过程必须遵守,即同一个号必须提供相同的功能。第二组主要用于调试。第三组是由程序临时产生的号码。其它号码保留,不得使用。用户可以向服务器发送一组请求,称为批处理。批处理时用户不用等待服务器返回,而是使用一个特定的请求获得这一组请求的响应。批处理时通常使用TCP。而UDP多使用于广播式RPC,对于支持广播的服务器,它们在成功时返回确定,在失败时什么也不返回(此规定可根据实现不同而不用加以遵守)。下面我们来定义RPC消息:

enum msg_type {

CALL = 0,

REPLY = 1

14

};

当一个消息接收到时,下面是调用远程过程调用的状态:

enum accept_stat {

SUCCESS = 0, /* RPC executed successfully */

PROG_UNAVAIL = 1, /* remote hasn't exported

program */

PROG_MISMATCH = 2, /* remote can't support

version # */

PROC_UNAVAIL = 3, /* program can't support

procedure */

GARBAGE_ARGS = 4, /* procedure can't decode

params */

SYSTEM_ERR = 5 /* errors like memory allocation

failure */

};

调用消息被拒绝的原因如下:

enum reject_stat {

RPC_MISMATCH = 0, /* RPC version number != 2 */

AUTH_ERROR = 1 /* remote can't authenticate

caller */

};

15

认证失败的原因如下:

enum auth_stat {

AUTH_OK = 0, /* success */

/*

* failed at remote end

*/

AUTH_BADCRED = 1, /* bad credential (seal broken)

*/

AUTH_REJECTEDCRED = 2, /* client must begin new

session */

AUTH_BADVERF = 3, /* bad verifier (seal broken) */

AUTH_REJECTEDVERF = 4, /* verifier expired or

replayed */

AUTH_TOOWEAK = 5, /* rejected for security reasons

*/

/*

* failed locally

*/

AUTH_INVALIDRESP = 6, /* bogus response verifier

*/

AUTH_FAILED = 7 /* reason unknown */

};

16

消息体格式如下,其中XID是消息号,请求消息和返回消息的消息号必须一致。 struct rpc_msg {

unsigned int xid;

union switch (msg_type mtype) {

case CALL:

call_body cbody;

case REPLY:

reply_body rbody;

} body;

};

RPC的消息体,版本号为2:

struct call_body {

unsigned int rpcvers; /* must be equal to two (2) */

unsigned int prog;

unsigned int vers;

unsigned int proc;

opaque_auth cred;

opaque_auth verf;

/* procedure specific parameters start here */

};

虽然cred和verf是两个数据域,但我们通常将它们做一个处理。而响应消息格式如下:

17

union reply_body switch (reply_stat stat) {

case MSG_ACCEPTED:

accepted_reply areply;

case MSG_DENIED:

rejected_reply rreply;

} reply;

如果服务器接收这个请求,必须返回一个认证域以使自己为客户认证:

struct accepted_reply {

opaque_auth verf;

union switch (accept_stat stat) {

case SUCCESS:

opaque results[0];

/*

* procedure-specific results start here

*/

case PROG_MISMATCH:

struct {

unsigned int low;

unsigned int high;

} mismatch_info;

default:

18

/*

* Void. Cases include PROG_UNAVAIL,

PROC_UNAVAIL,

* GARBAGE_ARGS, and SYSTEM_ERR.

*/

void;

} reply_data;

};

服务器可以因为版本原因或认证原因拒绝请求,下面是拒绝消息的格式: union rejected_reply switch (reject_stat

stat) {

case RPC_MISMATCH:

struct {

unsigned int low;

unsigned int high;

} mismatch_info;

case AUTH_ERROR:

auth_stat stat;

};

认证虽然对于RPC是透明的,可是RPC必须有两种认证必须实现。任何一种新的认证机制必须有一种独立的认证号,这个号是统一管理的,用户可以通过 ***********获 19

得。其中NULL认证必须实现,我们推荐实现系统认证。NULL认证其实就是不认证,这里推荐相关的数据域长度为0。

RPC在其它通信协议之上,为了保证一个消息和另一消息分离并能够从错误中进行恢复,我们规定了一个消息片断称为RM,一个消息在一个RM中。一个RM中可以有多个记录片断,每个片断除四个字节的头外,还有一个0到2的31次方减1的数据域。

下面我们来描述一下RPC语言,这是对XDR的一个扩展。下面是一个PING的例子:

篇三:如何排除 RPC 终结点映射程序错误

简介本文逐步介绍了如何使用 Windows Server 2003

或 Windows 2000 Server CD-ROM 的 Support 文件夹中提供的,或者作为 Windows Server 2003 Resource Kit 或

Windows 2000 Server Resource Kit 的一部分提供的工具和实用工具,来排除 Windows Server 2003 和 Windows 2000

Server 中的远程过程调用 (RPC) 终结点映射程序错误。远程过程调用是 Windows 操作系统使用的一种协议。RPC

提供了一种进程间通信机制,使一台计算机上运行的程序可以在远程系统上运行代码。

在某些情况下,当您试图使用 Active Directory 站点和服务强制进行 Active Directory 复制时,当您试图使用

20

Dcpromo 工具提升附加的域控制器时,或者当您从命令行运行 netdom query fsmo 时,可能会收到类似以下内容的错误消息:终结点映射器中没有更多的终结点可用。其他症状可能包括:

注意:如果使用网络捕获程序(如网络监视器)来捕获网络流量,则当计算机尝试使用大于 1024 的任意端口与另一台计算机建立 RPC 会话时,计算机可能收不到响应。发送方计算机使用 RPC 终结点映射程序的通用唯一标识符

(UUID)。RPC 终结点映射程序的 UUID 是

E1AF8308-5D1F-11C9-91A4-08002B14A0FA。

更多信息Dcdiag 工具Dcdiag 工具分析林中或企业中域控制器的状态并报告所有问题,以帮助解决问题。当您运行 Dcdiag 工具时,可以使用该工具来帮助排除 RPC 终结点映射程序错误。为此,请按照下列步骤操作: 1.单击“开始”,单击“运行”,在“打开”框中键入“cmd”,然后单击“确定”。2.键入 dcdiag,然后按 Enter。如果存在 RPC 终结点映射程序问题,Dcdiag 工具会使用类似以下内容的错误消息进行响应: The replication generated an error

(1753):There are no more endpoints available from the

endpoint mapper.

DsBindWithSpnEx() failed with error 1753, There are

no more endpoints available from the endpoint mapper.

21

Directory Binding Error 1753:There are no more

endpoints available from the endpoint mapper.

DsBind() failed with error 1753, There are no more

endpoints available from the endpoint mapper.

DsBindWithSpnEx() failed with error 1722, The RPC

server is unavailable.

DsBindWithCred() failed with error 1753. There are no

more endpoints available from the endpoint mapper.

Status is 1722:The RPC server is unavailable.

Netdiag 工具可以使用 Netdiag 工具帮助找出网络和连接问题。并且可以使用该工具帮助解决 RPC 终结点映射程序问题。为此,请按照下列步骤操作: 1.单击“开始”,单击“运行”,在“打开”框中键入“cmd”,然后单击“确定”。2.键入 netdiag,然后按 Enter。如果存在 RPC 终结点映射程序问题,Netdiag 工具会使用类似以下内容的错误消息进行响应:

[WARNING] Failed to query SPN registration on DC

.

Kerberos test.. . . . . . . . . . : Skipped Your logon domain

isn't

Kerberos.(<DomainnameAdministrator)

cannot be tested. DC list

22

running

Kerberos

test .. . . . . . . . . . : Failed [WARNING] Cannot call

DsBind to et

(10.55.0.110).[EPT_S_NOT_REGISTERED]

Trust relationship test.. . . . . : Failed Test to ensure

DomainSid of domain '<domainname' is

correct.[FATAL] Secure channel to domain

is '<domainname'

broken.[ERROR_ACCESS_DENIED]

Repadmin 工具可以使用 Repadmin 工具进行 Active

Directory 复制、解决 Active Directory 复制问题和 RPC

终结点映射程序问题。为此,请按照下列步骤操作: 1.单击“开始”,单击“运行”,在“打开”框中键入“cmd”,然后单击“确定”。2.键入 Repadmin /bind,然后按 Enter。如果存在 RPC 终结点映射程序问题,Repadmin 工具会使用类似以下内容的错误消息进行响应: DsBindWithCred to

localhost failed with status 1753 (0x6d9):There are no more

endpoints available from the endpoint mapper.

Ntdsutil 工具企业管理员和域管理员可以使用

Ntdsutil 工具来管理和修复 Active Directory,并帮助解决

RPC 终结点映射程序问题。要帮助解决 RPC 终结点映射程序问题,请按照下列步骤操作: 1.单击“开始”,单击“运行”,在“打开”框中键入“cmd”,然后单击“确定”。2. 23

键入 NTDSUtil ?,然后按 Enter。3.在“ntdsutil:”提示符处,键入 Metadata cleanup,然后按 Enter。4.在“metadata

cleanup:”提示符处,键入 Connections,然后按 Enter。5.在“Connections:”提示符处,键入 Connect to server

localhost,然后按 Enter。如果存在 RPC 终结点映射程序问题,Ntdsutil 工具会使用类似以下内容的错误消息进行响应: DsBindW error 0x6d9 (There are no more endpoints

available from the endpoint mapper.)

Gpotool 工具可以使用 Gpotool 工具检查域控制器中组策略对象的一致性。Gpotool 工具包含在 Windows

Server 2003 Resource Kit 中。可以通过访问以下 Microsoft

网站下载 Windows Server 2003 Resource Kit:

/downloads/?FamilyID=9d467a69-57ff-4ae7-96ee-b18c4790cffd&DisplayLang=en

(/downloads/?FamilyID=9d467a69-57ff-4ae7-96ee-b18c4790cffd&DisplayLang=en)

安装 Reso

urce Kit 后,可以使用 Gpotool 工具帮助解决 RPC

终结点映射程序问题。为此,请按照下列步骤操作: 1.单击“开始”,指向“程序”,单击“Windows Resource Kit 工具”,然后单击“命令外壳”。2.键入 gpotool,然后按 Enter。 如果存在 RPC 终结点映射程序问题,Gpotool 工具会使用类 24

似以下内容的错误消息进行响应: GPOTOOL:e

ERROR:GetDCList; DsBindW; hr=800706d9; There are no

more endpoints available from the endpoint mapper.

GPOTOOL:+

File:d:;

Line:728

GPOTOOL:e ERROR:GetDCList; GetDCList failed;

hr=800706d9; There are no more endpoints available from

the endpoint mapper.

GPOTOOL:+

File:d:;

Line:644

事件查看器

当 RPC 无法正常工作时,域客户端、成员服务器或域控制器中可能会记录下列事件:

事件 ID: 1053

来源: Userenv

描述:Windows 不能确定用户或计算机名称。(终结点映射器中没有更多的终结点可用。)组策略处理中止。

事件 ID: 1000

来源: Userenv

描述:Windows 不能确定用户或计算机名称。返回值

25

(1753)。 :

事件 ID: 1168

来源:NTDS General

描述:发生错误 -1073741823(c0000001)(内部 ID

3000b35)。请与 Microsoft 产品支持服务联系以获得帮助。

事件 ID: 1265

来源:NTDS KCC

描述:尝试使用下列参数建立复制链接时失败: 分区:CN=Configuration,DC=contoso,DC=com

DN:CN=NTDS

Settings,CN=ServerName,CN=Servers,CN=domainname,CN=Sites,CN=Configuration,DC=contoso,DC=com 源 DSA

地址:70863dce-1031-47ea-a567-2f46212dd361._ 站点间传输 (如果有):CN=IP,CN=Inter-Site

Transports,CN=Sites,CN=Configuration,DC=securityroot,DC=net 状态如下:终结点映射器中没有更多的终结点可用。记录数据是状态码。将重试此操作。

事件 ID: 1656

来源:NTDS 常规事件

描述:目录服务找不到任何安装在此计算机上的 RPC

协议序列,错误是 1719。如果这种情况继续存在,目录服 26

源 DSA

务将无法对任何 RPC 请求作出响应。

事件 ID: 10010

来源: DCOM

描述:服务器

{8BC3F05E-D86B-11D0-A075-00C04FB68820} 没有在限定的时间内用 DCOM 注册。

事件 ID: 4097

来源: EventSystem

描述:COM+ 事件系统在其内容处理过程中检测到一个错误的返回代

码。. 第 42 行中的 HRESULT 是

80070005。请与 Microsoft 产品支持服务联系以报告此错误。

事件 ID: 1012

来源: Winlogon

描述:自动证书注册子系统不能访问注册需要的本地资源。注册不能执行。(0x800706d9) 终结点映射器中没有更多的终结点可用。

Active Directory 安装向导 () 将基于

Windows Server 的计算机提升为域控制器。如果 Dcpromo

工具由于 RPC 问题而失败,则 文件中会出现类似以下内容的错误消息。

27

注意: 文件位于 %windir%Debug 文件夹中。

02/07 21:08:48 [INFO] Error - The Directory Service

failed to create the object

CN=Name,CN=Partitions,CN=Configuration,DC=domain,DC=

check the event log for possible system errors.(1753)

02/07 21:08:49 [INFO] NtdsInstall for

returned 1753 02/07 21:08:49

[INFO] DsRolepInstallDs returned 1753 02/07 21:08:49

[ERROR] Failed to install the directory service (1753)

10/03 10:13:17 [INFO] Error - The Directory Service

failed to create the server object for CN=NTDS

Settings,CN=name,CN=Servers,CN=name,CN=Sites,CN=Configuration,DC=domainname ,DC=com on server

ensure the network

credentials provided have sufficient access to add a

replica.(1753) 10/03 10:13:17 [INFO] NtdsInstall for

. returned 1753 10/03 10:13:17

[INFO] DsRolepInstallDs returned 1753 10/03 10:13:17

[ERROR] Failed to install to Directory Service (1753)

06/20 16:41:27 [INFO] Error - The initial LDAP

28

connection to server FQDNServerName failed.(58) 06/20

16:41:27 [INFO] NtdsInstall for

. returned 58 06/20 16:41:27

[INFO] DsRolepInstallDs returned 58 06/20 16:41:27

[ERROR] Failed to install the directory service (58)

06/21 11:49:57 [INFO] Error - The Directory Service

failed to replicate the partition

CN=Schema,CN=Configuration,DC=...(1722) 06/21 11:49:59

[INFO] NtdsInstall for .

returned 1722 06/21 11:49:59

[INFO] DsRolepInstallDs returned 1722 06/21 11:49:59

[ERROR] Failed to install the directory service (1722)

06/21 17:08:41 [INFO] NtdsInstall for

. returned 1753 06/21 17:08:41

[INFO] DsRolepInstallDs returned 1753 06/21 17:08:41

[ERROR] Failed to install the directory service (1753)

注意:这些错误代码代表以下内容: ?错误代码 58 代表“指定的服务器无法运行请求的操作”。?错误代码 1722

代表“RPC 服务器不可用”。?错误代码 1753 代表 “终结点映射程序中没有更多可用的终结点”。

另外, 也可能报告类似以下内容的错误消息:

dcpromoui

29

t:0x0C4 01335 Enter

State::SetFailureMessage The operation failed because:The

Directory Service failed to create the object

CN=Name,CN=Partitions,CN=Configuration,DC=Domainname,DC=com.

回到顶端

Active Directory 迁移工具

Active Directory 迁移工具 (ADMT) 可能会在运行

ADMT 的计算机的事件查看器中生成类似以下内容的事件: 事件 ID: 1540

来源: NTDS Replication

描述:添加 SID 到对象 ? 时出现错误 1753,DSID

11a05b1。

%windir%debug 中的 日志显示如下:

clonepr t:0x5CC 00254 HRESULT = 0x800706D9

clonepr t:0x5CC

00255 Enter GetErrorMessage 800706D9 clonepr

t:0x5CC 00256 Exit GetErrorMessage 800706D9 clonepr

t:0x5CC 00257 Enter SetComError 将源 SID 添加到目标对象的 SID 历史记录中失败。错误是:“终结点映射程序中没有更多的终结点可用。 clonepr t:0x5CC 00258 Exit

SetComError 将源 SID 添加到目标对象的 SID 历史记录中失败。错误是“终结点映射程序中没有更多的终结点可用。:

30

如何解决 RPC 终结点映射程序错误

警告:注册表编辑器使用不当可能导致严重问题,可能需要重新安装操作系统。Microsoft 不能保证您可以解决因注册表编辑器使用不当而导致的问题。使用注册表编辑器需要您自担风险。

“没有更多的终结点可用”错误消息表示 RPC 终结点映射程序无法对基于 RPC 运行的服务使用大于 1024 的端口。

注意:RPC 终结点映射程序在端口 135 上运行。

RPC 可以使用多达 65535 个端口。默认情况下,所有版本的 Windows 都只使用 1024-5000 之间的端口。 要修复 RPC 终结点映射程序,请按照下列步骤操作: 1.在出错的服务器上验证下列服务的状态和启动类型: 计算机类型RPC 服务RPC Locator 服务基于 Windows Server 2003

的域控制器已启动,自动已停止,手动基于 Windows Server

2003 的成员服务器已启动,自动已停止,手动基于

Windows Server 2003 的独立服务器已启动,自动已停止,手动基于 Windows 2000 Server 的域控制器已启动,自动已启动,自动基于 Windows 2000 Server 的成员服务器已启动,自动已启动,手动基于 Windows 2000 Server 的独立服务器已启动,自动已停止,手动如果对 RPC 服务或 RPC

Locator 服务的设置进行更改,则应重新启动计算机,然后 31

再次测试问题。

32