数据库中的信息按照类进行组织。 类的定义包括该类的所有记录或对象通用的信息。 属于同一类的记录具有相似含义。 例如,USER 类中的每个记录均表示用户;GROUP 类中的每个记录均表示一组用户;TERMINAL 类中的每个记录均表示用户可以访问当前主机的终端。 每个类包含属性定义表,其中包括您可以向属于此类的记录分配的属性列表。
记录是一个实体,表示该类的一个实例。 例如,USER 类中的一个记录表示一个用户。 每个类都包含特定于此类的属性或字段。 通过为记录属性分配值,可将信息存储在记录中。 属性的定义包括有关数据布局的信息以及定义数据如何存储在数据库中的属性的信息。 您可以为记录的每个属性分配值。 记录类的定义确定可向记录分配哪些属性以及可向每个属性分配什么值。
使用示例可以最好地说明数据库结构。 考虑 USER 类。 USER 类中的每个记录都表示系统的一个用户。 USER 类的属性定义表包含可分配给用户记录的属性的列表。 该列表中的一些属性为 FULL_NAME、ORGANIZATION 和 GROUPS。 您可以向数据库中记录所表示的每个用户分配这些属性的值。 例如,FULL_NAME 属性存储用户的全名;ORGANIZATION 属性存储用户所属组织的相关信息;GROUPS 属性包含用户所属组的列表。 记录的属性类似于数据库记录中的字段。 属性的格式因属性定义而异。 在此示例中,FULL_NAME 和 ORGANIZATION 属性只有一个值,而 GROUPS 属性是由不定数目的重复元素组成的列表。 一个用户可以属于无限多个组。
数据库中的每个类都具有名称以及与该名称相关联的 ID。 数据库引擎在内部使用类 ID,实现更好的性能以及更小的数据库文件大小。 除内部使用外,类 ID 不具有任何意义,而且它在各个数据库之间可能不同。 请使用类名;勿使用类 ID。
数据库中类的每个属性都具有名称以及与该属性名称相关联的 ID。 数据库引擎在内部使用属性 ID,实现更好的性能以及更小的数据库文件大小。 注意:每个类都有自己的属性定义表;因此,一个属性名可以在多个类中出现,并且此属性在不同类中可能具有不同属性。 属性按照其名称和驻留的类的名称或其唯一的属性 ID 进行标识。
数据库中的每个记录都具有一个名称且属于一个类。 不同类中的记录可以具有相同名称。 数据库中的每个记录都与记录 ID 相关联。 记录 ID 是数据库中每个记录唯一的 32 位编号。‑ CA ControlMinder 在内部使用记录 ID。 引用记录时,可以使用记录名称或记录 ID。
数据库中的每个记录可以为其属性分配值。 CA ControlMinder 自动设置一些属性,用户可显式设置其他属性。 通过使用包含在 CA ControlMinder 中的工具,安全管理员或指派的负责人可以设置大多数属性。
注意:有关每个类支持的属性的详细信息,请参阅《selang 参考指南》。
数据库由以下数据文件组成:
类说明文件包含类定义表。
对象说明文件包含记录定义表。
属性说明文件包含属性定义表。
属性值文件包含为每个 CA ControlMinder 属性分配的值。
数据文件还包含索引文件,这些文件未在此处提及,因为它们对管理 API 是透明的。
类说明文件将定义的所有类的信息存储到 CA ControlMinder。 其中存储的信息包括类名、类 ID 和 CA ControlMinder 在内部使用的其他标志。 类信息存储在称为 SEOSDB_CDF 的结构中。
属性说明文件将定义的每个属性的信息存储到 CA ControlMinder。 属性信息包括:
将某些属性定义为单个值,将其他属性定义为列表值。 属性说明信息存储在称为 SEOSDB_PDF 的结构中。
对象说明文件将定义的每个记录的基本信息存储到 CA ControlMinder。 下列数据存储在对象说明文件中:
对象说明信息存储在名为 SEOSDB_ODF 的结构中。
属性值文件包含为数据库中定义的每个记录的每个属性分配的值。 每个条目包括:
用于完整性检查的信息也存储在属性值文件中;但是,无法使用管理 API 访问此信息。
本部分介绍数据库中存在的各种类型的列表。
用户记录和组记录都包含定义了用户与组的连接的数据。
用户记录包含用户所属组的列表。 下列信息存储在用户记录中:
组记录包含连接到该组的用户的列表。 该列表仅包含用户的记录 ID。
在将某一用户连接到某一组时,连接到该用户的组的列表以及连接到该组的用户的列表必须进行更新。 在用户连接到组时,CA ControlMinder 会自动更新这两个列表。 如果之后从数据库中删除用户,则无法从包含用户 ID 的每个组记录中删除该用户。 因此,某些组记录可能包含数据库中不再存在的用户的用户 ID。 CA ControlMinder 采用以下方式生成新对象 ID:确保在数据库的有效时间内无法将一个 ID 多次分配给一个对象。 组记录中未使用的用户 ID 不会构成安全威胁。
类似于用户与组的连接,资源与资源组的连接既存储在资源记录中,又存储在资源组记录中。‑ 资源记录包括标识资源连接到的资源组的记录 ID 列表。 资源组记录包括标识连接到资源组的资源的资源 ID 列表。 每当资源连接到资源组时,会自动更新资源和资源组记录。
访问控制列表 (ACL) 是资源记录中的零个或零个以上条目的列表。 ACL 中的每个条目都定义了数据库中的访问者对象对资源拥有的访问权限。 每个 ACL 条目包括:
该条目决定了允许访问者对由该资源记录表示的资源执行的操作。
CA ControlMinder 也提供程序访问控制列表 (PACL),也称为条件 ACL,其类似于常规 ACL。 除访问者的记录 ID 和访问者的授权级别之外,PACL 条目还包括 PROGRAM 记录 ID。
按照约定,CA ControlMinder 不会将为零的对象 ID 分配给任何对象。 在 ACL 和 PACL 中,为零的对象 ID 表示用户 (*)-也就是说,所有 CA ControlMinder 定义的用户。
注意:有关 ACL 的详细信息,请参阅《selang 参考指南》中的 authorize 命令。
在用户登录系统时,CA ControlMinder 将访问者环境元素 (ACEE) 分配给每个用户。 ACEE 是包含用户凭据和各种安全参数定义的数据结构。 由登录过程所创建的每个进程将继承父进程的 ACEE。 即使该进程通过执行系统的 su 实用程序或 sesu 实用程序来替代用户,也会维护 ACEE。
每个 ACEE 都有句柄,可以随时唯一地介绍进程的凭据和其他信息。 ACEE 及其关联的句柄始终存在,直到创建它们的登录会话终止。
管理 API 和所有 CA ControlMinder 授权过程使用 ACEE 句柄来标识和介绍发出请求的用户。
管理 API 包含提取用户的 ACEE 或 ACEE 句柄的函数。 在 UNIX 中,可以使用具有相应选项的 sewhoami 实用程序查看由这些函数所获取的信息。
注意:有关 sewhoami 实用程序的详细信息,请参阅《参考指南》。
与 CA ControlMinder 语言解释器相比,管理 API 使用更简单的安全范围方法,以免对性能产生负面影响。
管理 API 使用在用户的 USER 记录中设置的属性,但是忽略使用所有权、组属性和 ADMIN 类的其他权限。 这表示用户无法使用管理 API 执行某些操作,但是这些操作可以通过使用 selang、selangx、CA ControlMinder 管理员 (seadm) 或策略管理器执行。 例如,在 selang 中,用户可以显示或更新用户拥有的对象。 但是,除非对象的所有者也有 ADMIN 属性,否则管理 API 不允许该所有者进行更新。
管理 API 使用以下约定:
要使用此 API,需要在源代码中包含具有原型和结构定义的标头文件。 所有原型都在 seadmapi.h 文件中,而大多数数据类型在其他标头文件中。 seostype.h 标头文件提供存储在数据库中的所有数据的结构定义。 审核日志记录和错误日志记录的结构定义位于标头文件 selogtype.h 中。
本部分讨论必须使用此 API 的库。
seadmapi 包括单个库文件 seadmapi.a,它应与使用此 API 的每个已编译的源文件链接。
CA ControlMinder 包括名为 ibseadmapi.xx 的此 API 的共享库版本,其中 xx 是共享库名称的标准操作系统约定(通常为 so 或 sl)。 在执行使用共享库的程序(如 sample_TermOwn.c)之前,请检查环境变量是否指向共享库的路径。 要将环境指向共享路径,请输入:
setenv LD_LIBRARY_PATH /opt/CA/AccessControl/lib
要使用 seadmapi 函数编译和链接程序,请确保链接路径中包含静态库 seadmapi.lib。 通常可以在 ACDir\lib(其中,ACDir 是您安装 CA ControlMinder 的目录,默认情况下为 C:\Program Files\CA\Access Control)中找到此库。
在执行使用此库的程序之前,请检查环境变量是否指向库的路径。
使用 seadmapi 编译不需要任何特殊标志。 相反,链接可能需要其他设置。 遗憾的是,这些标志依赖于计算机和操作系统。 使用由该 API 示例提供的 makefile,并查看这些示例了解最新信息。‑‑
重要说明! 为避免死锁,请不要在 seosd exit 中使用任何管理 API 函数。
由此 API 提供的所有函数都是线程安全的函数。‑ 如果函数不是线程安全的函数,则该函数的“说明”部分会指出该事实。‑
注意:必须先调用 seadmapi_init 或 seadmapi_IsSeOSSyscallLoaded 函数,然后才能在 seadmapi 库调用任何其他函数。
管理 API 包括分为以下类别的函数:
以下函数对 CA ControlMinder 类执行操作:
检索数据库中的特定类。
检索数据库中的第一个类。
检索数据库中的下一个类。
以下函数对属性执行操作:
检索特定属性的说明。
检索类的第一个属性说明。
检索类的下一个属性说明。
以下函数对对象执行操作:
释放由 ObjInClassList 检索的对象的列表。
检索特定对象的信息。
检索类中第一个对象的信息。
检索对象 ID 大于或等于指定对象 ID 的对象的信息。
检索类中下一个对象的信息。
检索指定类中的对象的列表。
以下函数对值执行操作:
获取列表类型属性的值。
获取单值属性的值。
释放 FetchListPropVal 中值的列表。
设置单个属性值类型的值。
以下函数执行查询:
使用之前已初始化的实体管理器检索整个对象及其属性值。
使用之前已初始化的实体管理器检索整个对象及其属性值,包括对象名和类名。
检索关于用户的宽限信息。
初始化用于 GetEntity 和 GetExEntity 操作的实体查询缓冲区。
释放由 InitEntityRuler 函数为实体样式查询分配的内存。
释放由 MakePDFList 函数分配的属性描述符的列表。
从属性名列表创建属性描述符列表。
将对象 ID 转换为对象名。
以下函数对日志文件执行操作:
提交 ADMIN 审核记录。
提供用于提交审核记录的接口。
提交服务连接的资源审核记录。
将说明提交到错误日志。
提交常规资源审核记录。‑
提交 TCP/IP 审核记录。
提交登录审核记录。
提交关闭的审核记录。
提交启动的审核记录。
提交用户审核记录。
提交 watchdog 审核记录。
提交 ADMIN 通知记录。
提交服务连接的资源通知记录。
提交常规资源通知记录。‑
提交 TCP/IP 通知记录。
提交登录通知记录。
提交关闭的通知记录。
提交启动的通知记录。
提交用户通知记录。
提交 watchdog 通知记录。
以下函数提供控制台操作:
禁用所有系统登录。
启用所有系统登录。
获取全局登录控件的状态。‑
将消息发送到 CA ControlMinder 跟踪。
刷新主机名到主机 IP 地址的解析。
获取运行时统计信息。
关闭 CA ControlMinder。
清除跟踪文件。
禁用 CA ControlMinder 跟踪。
启用 CA ControlMinder 跟踪。
返回 CA ControlMinder 跟踪的状态。
切换 CA ControlMinder 跟踪。
禁用用户 ID 的登录。
启用用户 ID 的登录。
获取 UID 并发登录状态。
以下函数执行不属于以上任何类别的函数:
释放由 seadmapi_GetACEE 函数分配的内存。
检索当前进程用户的 ACEE。
使用 CA ControlMinder 消息文件从给定的错误代码中检索错误字符串。
检索当前进程用户类型的信息。
初始化 CA ControlMinder 中的通信通道。
确定是否加载了 CA ControlMinder 系统调用。
提供对当前进程的控制。
检索当前进程的信息
检索关于用户的属性信息。
用新密码替换用户密码。
这些函数检索数据库中定义的类的信息。
要扫描数据库中的所有类,请先调用 seadmapi_ClassGetFirst 函数,然后为每个后续类调用 seadmapi_ClassGetNext 函数。
这些函数可以由具有以下任意属性的用户执行的进程进行调用:
Watchdog 和代理也可以使用这些函数。
如果函数成功,则返回零;如果失败,则返回错误代码。
int seadmapi_ClassGetEqual(const char *szClass, \ SEOS_CID cid, \ SEOSDB_CDF *p_seclass); int seadmapi_ClassGetFirst(SEOSDB_CDF *p_seclass); int seadmapi_ClassGetNext(SEOSDB_CDF *p_seclass);
要检索其信息的类的名称。 如果在 cid 参数中指定类 ID,请将该参数设置为 NULL。
要检索其信息的类的类 ID。 如果为 szClass 参数指定类名,请将该参数设置为 ‑1。
指向包含函数所检索信息的结构的指针。 对于 seadmapi_ClassGetNext,数据结构必须包含之前调用 ClassGetNext 函数或 ClassGetFirst 函数获得的值。
示例
/*========================================================= 项目 :eTrust 模块 :eTrust 版本:8.0 文件 :sample_ListClass.c 目的 :示例 seadmapi,列出类名。 =========================================================== 版权: 版权所有 2004 Computer Associates International, Inc. ===========================================================*/ #include <ctype.h> #include <stdio.h> #include <sys/types.h> #include <unistd.h> #include <seadmapi.h> int main (void) { SEOSDB_CDF cdf; int rv; /* ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ */ /* 获取数据库中的第一个类。 */ /* ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ */ rv = seadmapi_ClassGetFirst(&cdf); if ( rv ) { printf("seadmapi_ClassGetFirst returned 0x%04x\n", rv ); return 1; } /* ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ */ /* 如果成功,则继续针对所有类的循环。 */ /* ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ */ while (!rv) { printf( "%s\n", cdf.szCName ); rv = seadmapi_ClassGetNext(&cdf); } return 0; }
这些函数检索数据库中定义的一个或多个属性的信息。
要扫描特定类中的所有属性,请先调用 seadmapi_PropGetFirstInClass 函数,然后为每个后续属性调用 seadmapi_PropGetNextInClass 函数。
这些函数可以由具有以下任意属性的用户执行的进程进行调用:
Watchdog 和代理也可以使用这些函数。 任何进程可以对任何属性发出 seadmapi_PropGetEqual 请求。
如果函数成功,则返回 0;如果失败,则返回错误代码。
int seadmapi_PropGetEqual(const char *szClass, SEOSDB_CDF *p_seclass, const char *szProp, SEOS_PID pid, SEOSDB_PDF *p_seprop); int seadmapi_PropGetFirstInClass(const char *szClass, SEOSDB_CDF *p_seclass, SEOSDB_PDF *p_seprop); int seadmapi_PropGetNextInClass(SEOSDB_PDF *p_seprop);
类名。 指定类说明而非类名时,请将该参数设置为 NULL。
类说明。 指定类名而非类描述符时,请将该参数设置为 NULL。 注意,该参数为 NULL 时,szClass 不得为 NULL。
属性名。 指定属性 ID 而非属性名时,请将该参数设置为 NULL。
属性 ID。 指定属性名而非属性 ID 时,请将该参数设置为 ‑1。
指向包含函数所检索信息的数据结构的指针。
示例
以下示例说明如何使用 seadmapi_PropGetFirstInClass 和 seadmapi_PropGetNextInClass 检索类中属性的值。
/*========================================================= 项目 :eTrust 模块 :eTrust 版本:8.0 文件 :sample_ListProp.c 目的 :列出特定类的属性。 =========================================================== 版权: 版权所有 2004 Computer Associates International, Inc. ===========================================================*/ #include <ctype.h> #include <stdio.h> #include <string.h> #include <sys/types.h> #include <unistd.h> #include <seadmapi.h> static int ErrorMessage( int rv ); int main(int argc, char *argv[]) { SEOSDB_CDF cdf; /* 类说明 */ SEOSDB_PDF prop; /* 属性说明 */ char Class[CNAME_SIZE+1]; unsigned props_cnt = 0; int rv; if ( argc < 2 ) { fprintf(stderr, "Required parameter (class name) is missing.\n"); return 1; } /* ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ */ /* 通过指定的参数设置类名。 */ /* ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ */ strcpy(Class, argv[1]); /* ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ */ /* 清除属性描述符。 */ /* ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ */ memset( &prop, 0, sizeof(prop) ); /* ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ */ /* 通过获取类描述符,检查类是否存在。 */ /* ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ */ rv = seadmapi_ClassGetEqual(Class, 0, &cdf); if (rv) return ErrorMessage(rv); /* ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ */ /* 在属性描述符中设置类 ID。 */ /* ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ */ prop.sCId = cdf.sCId; /* ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ */ /* 针对类中的所有属性进行循环。 */ /* 检查 rv 0 或 1 以找到所有 */ /* 等于或大于提供的属性 */ /* (值为 0)的属性。 */ /* ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ */ rv = seadmapi_PropGetFirstInClass( NULL, &cdf, &prop ); while ( (rv == 0) || (rv == 1) ) { if ( prop.sCId == cdf.sCId ) { props_cnt++; printf("%s %s\n", Class, prop.szPName); } rv = seadmapi_PropGetNextInClass( &prop ); } if ( props_cnt == 0 ) printf("Class %s, does not contain this property.\n", Class); return 0; } /* ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ */ /* 显示错误消息。 */ /* ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ */ static int ErrorMessage( int rv ) { char msg_buff[1024]; seadmapi_GetMessage(rv, sizeof(msg_buff), msg_buff); fprintf(stderr, "%s.\n", msg_buff); return rv; }
这些函数检索数据库中对象(记录)的信息。
要按顺序扫描类中的所有对象,请先调用 seadmapi_ObjGetFirstInClass,然后为每个后续对象调用 seadmapi_ObjGetNextInClass。
这些函数可以由具有以下任意属性的用户执行的进程进行调用:
Watchdog 和代理也可以使用这些函数。
seadmapi_ObjGetGreaterEqual 函数返回以下值之一:
此函数检索其对象 ID 等于指定对象的对象 ID 的对象信息。
此函数检索其对象 ID 大于指定对象的对象 ID 的对象信息。
函数失败。
如果成功,则其余函数返回 0;如果失败,则返回错误代码。
int seadmapi_ObjGetEqual(const char *szClass, SEOSDB_CDF *p_seclass, const char *szObj, SEOS_OID oid, SEOSDB_ODF *p_seobj); int seadmapi_ObjGetFirstInClass(const char *szClass, SEOSDB_CDF *p_seclass, SEOSDB_ODF *p_seobj); int seadmapi_ObjGetNextInClass(SEOSDB_ODF *p_seobj); int seadmapi_ObjGetGreaterEqual(const char *szClass, SEOSDB_CDF *p_seclass, const char *szObj, SEOS_OID oid, EOSDB_ODF *p_seobj);
对象所属的类的名称。 如果使用 p_seclass 参数指定类,请将该参数设置为 NULL。
指向包含类描述符的结构的指针。 如果指定 szClass 参数,请将该参数设置为 NULL。
要提取其值的对象的名称。 如果指定对象 ID 而非对象名称,请将该参数设置为 NULL。
要检索其信息的对象的对象 ID。 如果指定对象名称而非对象 ID,请将该参数设置为 ‑2。
指向包含函数所检索信息的结构的指针。
示例
以下示例说明如何使用 seadmi_ObjGetFirstInClass 和 seadmi_ObjGetNextInClass 检索特定类中的所有对象。
/*========================================================= 项目 :eTrust 模块 :eTrust 版本:8.0 文件 :sample_ListObjs.c 目的 :显示类中的对象。 =========================================================== 版权: 版权所有 2004 Computer Associates International, Inc. ===========================================================*/ #include <ctype.h> #include <stdio.h> #include <string.h> #include <sys/types.h> #include <unistd.h> #include <seadmapi.h> static int ErrorMessage( int rv ); int main(int argc, char *argv[]) { SEOSDB_ODF odf; /* 循环中的当前 ODF */ SEOSDB_CDF cdf; /* 类说明 */ char Class[CNAME_SIZE+1]; unsigned ents = 0; int rv; if ( argc < 2 ) { fprintf(stderr, "Required parameter missing.\n"); fprintf(stderr, "Usage: '%s CLASS_NAME'\n", argv[0]); return 1; } /* ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ */ /* 通过指定的参数设置类名。 */ /* ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ */ strcpy(Class, argv[1]); /* ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ */ /* 清除对象描述符。 */ /* ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ */ memset( &odf, 0, sizeof(odf) ); /* ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ */ /* 通过获取类描述符,检查类是否存在。 */ /* ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ */ rv = seadmapi_ClassGetEqual(Class, 0, &cdf); if (rv) return ErrorMessage(rv); /* ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ */ /* 在对象描述符中设置类 ID。 */ /* ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ */ odf.sCId = cdf.sCId; /* ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ */ /* 针对类中的所有对象进行循环。 */ /* ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ */ rv = seadmapi_ObjGetFirstInClass( NULL, &cdf, &odf ); while ( (rv == 0) || (rv == 1) ) { if ( odf.sCId == cdf.sCId ) { ents++; printf("%s %s\n", Class, odf.szOName); } rv = seadmapi_ObjGetNextInClass( &odf ); } if ( ents > 0 ) printf("Total of %d objects found in Class=%s\n", ents, Class); else printf("Class %s, does not have any object.\n", Class); return 0; } /* ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ */ /* 显示安全后台进程中的错误消息。 */ /* ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ */ static int ErrorMessage( int rv ) { char msg_buff[1024]; seadmapi_GetMessage(rv, sizeof(msg_buff), msg_buff); fprintf(stderr, "%s.\n", msg_buff); return rv; }
seadmapi_ObjInClassList 函数检索指定类中的对象列表。
字段 SEADMAPI_MAXOBJSLIST 指定可在单个调用中检索的条目数的限制。
在调用此函数后,您应当调用 seadmapi_FreeObjList 函数来释放为查询分配的内存。 使用此函数返回的 ptr 参数。
如果函数成功,则返回 0;如果失败,则返回错误代码。
int seadmapi_ObjInClassList (SEOSDB_CDF *pcdf, char *start, void **ptr, char **names, int *count);
指向类说明的指针。
表示列表开头的对象名称的字符串。
指向“void *”的指针,用于释放为列表查询分配的内存。
指向 char 指针向量的指针。 每个元素都指向一个对象名称。
进入时,指的是名称向量的大小。 返回时,指的是向量中的条目数。
seadmapi_FreeObjList 函数释放 seadmapi_ObjInClassList 函数分配的内存。
此函数向 *ptr 分配 NULL。
没有返回值。
int seadmapi_FreeObjList (void **ptr);
最近通过调用 seadmapi_ObjInClassList 函数获取的指针。
seadmapi_FetchListPropVal 函数检索包含列表的属性的值。 此函数无法检索单值属性的值;请改为使用 seadmapi_FetchSinglePropVal 函数。‑
此函数分配一个 void 指针向量,每个均指向包含列表中单个元素的一个已分配缓冲区。 调用方必须定义 void ** 类型或任何其他指向指针的指针类型(即 int **)的变量。 调用方向此变量发送一个指针,如以下示例所示。
{ int **list; unsigned int psize, count; int rc; ... rc = seadmapi_FetchListPropVal(.., (void ***)&list, &psize, &count);
调用后的内存布局:
参数 |
说明 |
[elem0] |
第 1 个数据元素 |
[elem1] |
第 2 个数据元素 |
[elemN] |
第 N+1 个数据元素 |
其中 elemN 存储在变量 count 中。
此函数提取的所有数据都已分配,必须释放。 要释放数据,请调用 seadmapi_FreeListPropVal 函数。
此函数可以由具有以下任意属性的用户执行的进程进行调用:
Watchdog 和代理也可以使用此函数。
如果函数成功,则返回 0;如果失败,则返回错误代码。
int seadmapi_FetchListPropVal(const char *szClass, SEOSDB_CDF *p_seclass, const char *szObj, SEOSDB_ODF *p_seobj, const char *szProp, SEOSDB_PDF *p_seprop, void ***val, unsigned int *psize, unsigned int *count);
对象所属的类的名称。 如果通过 p_seclass 参数标识类,请将该参数设置为 NULL。
指向包含类说明的结构的指针。 如果通过 szClass 参数标识类,请将该参数设置为 NULL。
要提取其属性值的记录的名称。 如果通过 p_seobj 参数标识对象,请将该参数设置为 NULL。
指向包含对象说明的结构的指针。 如果通过 szObj 参数标识对象,请将该参数设置为 NULL。
要提取其值的属性的名称。 如果通过 p_seprop 参数标识属性,请将该参数设置为 NULL。
指向包含属性说明的结构的指针。 如果通过 szProp 参数标识属性,请将该参数设置为 NULL。
指向提取的值类型的指针的指针。 有关详细信息,请参阅此列表下的说明。
提取的值的大小。
已分配向量中的元素数目。
示例
以下示例说明如何使用 seadmapi_FetchListPropVal 函数检索包含列表的属性的值。 此示例还说明如何使用 seadmapi_gconn 结构显示用户链接到的所有组。
/*========================================================= 项目 :eTrust 模块 :eTrust 版本:8.0 文件 :sample_FetchList.c 目的 :seadmapi 示例,显示包含列表的 属性。 显示用户连接到的 组列表。 =========================================================== 版权: 版权所有 2004 Computer Associates International, Inc. ===========================================================*/ #include <stdio.h> #include <string.h> #include <seadmapi.h> static int ErrorMessage( int rv ); int main(int argc, char *argv[]) { SEOSDB_ODF odf; SEOS_GCONN **list; char Object[ONAME_SIZE+1]; unsigned int elem_size; unsigned int list_cnt; int rv; int cnt; if ( argc < 2 ) { fprintf(stderr, "Required parameter (User Name) missing.\n"); return 1; } /* ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ */ /* 通过指定的参数设置对象名称。 */ /* ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ */ strcpy(Object, argv[1]); /* ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑*/ /* 获取类为 USER、属性为 GROUPS、 */ /* 对象为 Specified_Parm 的列表 */ /* ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑*/ rv = seadmapi_FetchListPropVal("USER", NULL, Object, NULL, "GROUPS", NULL, (void ***)&list, &elem_size, &list_cnt); /* ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ */ /* 在无法获取列表的情况下,退出并显示错误消息。 */ /* ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ */ if ( rv != 0 ) return ErrorMessage(rv); /* ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ */ /* 以循环方式显示列表中的所有组。 */ /* ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ */ for(cnt=0; cnt<list_cnt; cnt++) { rv = seadmapi_ObjGetEqual("GROUP", NULL, NULL, list[cnt]‑>oidGroup, &odf); if ( rv == 0 ) { printf("Group Name: %‑10s (id=%6ld)", odf.szOName, list[cnt]‑>oidGroup); if ( list[cnt]‑>ugmUserMode { printf(", Group"); if ( list[cnt]‑>ugmUserMode & SEOS_UGMODE_AUDITOR ) printf(" auditor"); if ( list[cnt]‑>ugmUserMode & SEOS_UGMODE_PWMANAGER ) printf(" pwmanager"); if ( list[cnt]‑>ugmUserMode & SEOS_UGMODE_ADMIN ) printf(" administrator"); } else printf(", Regular"); printf(".\n"); } else printf("Group id: %ld, no longer exits in database.\n", list[cnt]‑>oidGroup); } /* ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑*/ /* 释放列表。 */ /* ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ */ seadmapi_FreeListPropVal((void ***)&list, &list_cnt); return 0; } /* ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ */ /* 显示安全后台进程中的错误消息。 */ /* ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ */ static int ErrorMessage( int rv ) { char msg_buff[1024]; seadmapi_GetMessage(rv, sizeof(msg_buff), msg_buff); fprintf(stderr, "%s.\n", msg_buff); return rv; }
seadmapi_FetchSinglePropVal 函数检索包含单值的属性的值。 无法使用此函数检索列表;对于包含列表的属性,请使用函数 seadmapi_FetchListPropVal。 要存储属性的数据,调用程序必须在 val 变量指向的内存中分配空间。 要确定所需的大小,请使用属性描述符 sPVSize 成员或某些其他方式。
seadmapi_FetchSinglePropVal 函数可以由具有以下任意属性的用户执行的进程进行调用:
Watchdog 和代理也可以使用此函数。
任何想要查看私有数据的用户都可以使用此函数。 值设置为用户自己的记录的值。
所有用户都可以使用此函数来检索 SUDO 类或 SEOS 类的记录的值。
如果函数成功,则返回 0;如果失败,则返回错误代码。
int seadmapi_FetchSinglePropVal(const char *szClass, SEOSDB_CDF *p_seclass, const char *szObj, SEOSDB_ODF *p_seobj, const char *szProp, SEOSDB_PDF *p_seprop, void *val, int *size);
对象所属的类的名称。 如果通过 p_seclass 参数标识类,请将该参数设置为 NULL。
指向包含类说明的结构的指针。 如果通过 szClass 参数标识类,请将该参数设置为 NULL。
要提取其属性值的记录的名称。 如果通过 p_seobj 参数标识记录,请将该参数设置为 NULL。
指向包含对象说明的结构的指针。 如果通过 szObj 参数标识对象,请将该变量设置为 NULL。
要提取的属性的名称。 如果通过 p_seprop 参数标识属性,请将该变量设置为 NULL。
指向包含属性说明的结构的指针。 如果通过 sz_Prop 参数标识属性,请将该变量设置为 NULL。
指向内存中用于存储结果的位置的指针。
进入时,此值是参数 val 指向的存储区域的大小。 返回时,此值是内存区域中存储的数据的大小。
UNIX 示例
在 UNIX 中,以下示例说明如何使用 seadmapi_FetchSinglePropVal 检索单个属性的值。
/*========================================================= 项目 :eTrust 模块 :eTrust 版本:8.0 文件 :sample_FetchSingle.c 目的 :seadmapi 示例,列出 UNIX 系统中特定类的特定对象 中的给定属性的值。 =========================================================== 版权: 版权所有 2004 Computer Associates International, Inc. ===========================================================*/ #include <ctype.h> #include <stdio.h> #include <string.h> #include <sys/types.h> #include <unistd.h> #include <stdlib.h> #include <seadmapi.h> static int ErrorMessage( int rv ); int main(int argc, char *argv[]) { SEOSDB_PDF prop; /* 属性说明 */ char Class[CNAME_SIZE+1]; char Object[ONAME_SIZE+1]; char Property[PNAME_SIZE+1]; char *prop_val; int data_size; int rv; /* ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ */ /* 检查是否加载了 SeOS_syscall。 */ /* ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ */ rv = seadmapi_IsSeOSSyscallLoaded(); if ( rv != 0 ) { fprintf(stderr, "Database server is not running.\n"); return 1; } /* ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ */ /* 检查用户是否提供了所有必需的参数。 */ /* ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ */ if ( argc < 4 ) { fprintf(stderr, "Required parameter(s) missing.\n"); fprintf(stderr, "Usage: '%s CLASS_NAME PROPERTY_NAME OBJECT_NAME'\n", argv[0]); return 1; } /* ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ */ /* 设置类、属性和对象字段。 */ /* ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ */ strcpy(Class, argv[1]); strcpy(Property, argv[2]); strcpy(Object, argv[3]); /* ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ */ /* 清除属性和对象字段。 */ /* ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ */ memset( &prop, 0, sizeof(prop) ); /* ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ */ /* 获取属性描述符。 */ /* ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ */ rv = seadmapi_PropGetEqual( Class, NULL, Property, 0, &prop ); if (rv) return ErrorMessage(rv); /* ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ */ /* 检查字符串类型。 */ /* ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ */ if ( prop.cPType != SEOSDB_PTYPE_STR ) { fprintf(stderr, "This sample can display only character values.\n"); return 1; } /* ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ */ /* 根据属性大小为值的数据 */ /* 分配内存 */ /* ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ */ prop_val = (char *)malloc( (size_t)prop.sPVSize ); if ( prop_val == NULL ) { fprintf(stderr, "Failed to allocate required memory for property value.\n"); return 1; } data_size = prop.sPVSize; /* ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ */ /* 获取请求的属性值。 */ /* ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ */ rv = seadmapi_FetchSinglePropVal(Class, NULL, Object, NULL, NULL, &prop, prop_val, &data_size); if (rv) { free(prop_val); return ErrorMessage(rv); } printf("%s\n", prop_val); free(prop_val); return 0; } /* ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ */ /* 显示安全后台进程中的错误消息。 */ /* ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ */ static int ErrorMessage( int rv ) { char msg_buff[1024]; seadmapi_GetMessage(rv, sizeof(msg_buff), msg_buff); fprintf(stderr, "%s.\n", msg_buff); return rv; }
Windows 示例
在 Windows 中,以下示例说明如何使用 seadmapi_FetchSinglePropVal 检索单个属性的值。
/*========================================================= 项目 :eTrust 模块 :eTrust 版本:4.10 文件 :sample_FetchSingle.c 目的 :seadmapi 示例,列出 特定类的特定对象中的给定属性的值。 =========================================================== 版权: 版权所有 2004 Computer Associates International, Inc. ===========================================================*/ #include <ctype.h> #include <stdio.h> #include <string.h> #include <sys/types.h> #include <unistd.h> #include <stdlib.h> #include <seadmapi.h> static int ErrorMessage( int rv ); int main(int argc, char *argv[]) { SEOSDB_PDF prop; /* 属性说明 */ char Class[CNAME_SIZE+1]; char Object[ONAME_SIZE+1]; char Property[PNAME_SIZE+1]; char *prop_val; int data_size; int rv; /* ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ */ /* 检查用户是否提供了所有必需的参数。 */ /* ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ */ if ( argc < 4 ) { fprintf(stderr, "Required parameter(s) missing.\n"); fprintf(stderr, "Usage: '%s CLASS_NAME PROPERTY_NAME OBJECT_NAME'\n", argv[0]); return 1; } /* ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ */ /* 设置类、属性和对象字段。 */ /* ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ */ strcpy(Class, argv[1]); strcpy(Property, argv[2]); strcpy(Object, argv[3]); /* ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ */ /* 清除属性和对象字段。 */ /* ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ */ memset( &prop, 0, sizeof(prop) ); /* ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ */ /* 获取属性描述符。 */ /* ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ */ rv = seadmapi_PropGetEqual( Class, NULL, Property, 0, &prop ); if (rv) return ErrorMessage(rv); /* ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ */ /* 检查字符串类型。 */ /* ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ */ if ( prop.cPType != SEOSDB_PTYPE_STR ) { fprintf(stderr, "This sample can display only character values.\n"); return 1; } /* ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ */ /* 根据属性大小为值的数据 */ /* 分配内存 */ /* ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑*/ prop_val = (char *)malloc( (size_t)prop.sPVSize ); if ( prop_val == NULL ) { fprintf(stderr, "Failed to allocate required memory for property value.\n"); return 1; } data_size = prop.sPVSize; /* ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ */ /* 获取请求的属性值。 */ /* ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ */ rv = seadmapi_FetchSinglePropVal(Class, NULL, Object, NULL, NULL, &prop, prop_val, &data_size); if (rv) { free(prop_val); return ErrorMessage(rv); } printf("%s\n", prop_val); free(prop_val); return 0; } /* ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ */ /* 显示安全后台进程中的错误消息。 */ /* ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑*/ static int ErrorMessage( int rv ) { char msg_buff[1024]; seadmapi_GetMessage(rv, sizeof(msg_buff), msg_buff); fprintf(stderr, "%s.\n", msg_buff); return rv; }
在使用 seadmapi_FetchListPropVal 函数提取列表值后必须使用 seadmapi_FreeListPropVal 函数来释放为值分配的内存。 为此函数提供的参数必须与为 seadmapi_FetchListPropVal 函数提供的参数一样。
任何进程都可以调用此函数。
没有返回值。
void seadmapi_FreeListPropVal(void ***list, unsigned int *count);
指向 seadmapi_FetchListPropVal 函数分配的向量的指针。
指向已分配向量中的元素数目的指针。
seadmapi_SetSinglePropVal 函数设置单值属性的值。‑ Watchdog 和代理使用此函数。 为防止破坏数据库,不允许其他进程使用此函数。
只有 Watchdog 和代理才能使用 seadmapi_SetSinglePropVal 函数。
如果函数成功,则返回 0;如果失败,则返回错误代码。
int seadmapi_SetSinglePropVal(const char *szClass, const char *szObj, const char *szProp, void *val, int size);
记录所属的类的名称。
要设置其属性的记录的名称。
要设置其值的属性的名称。
要分配给属性的值。
值的大小(以字节为单位)。
seadmapi_MakePDFList 函数检索给定类的属性的整个列表。 此函数为属性向量分配内存。
使用 seadmapi_MakePDFList 函数后,请使用 seadmapi_KillPDFList 函数释放已分配的内存。
这些函数可以由具有以下任意属性的用户执行的进程进行调用:
Watchdog 和代理也可以使用这些函数。
如果 seadmapi_MakePDFList 函数成功,则返回 0;如果失败,则返回错误代码。
void seadmapi_KillPDFList(SEOSDB_PDF **ppPdf, unsigned int nCount); int seadmapi_MakePDFList(const char *szClass, SEOSDB_PDF **ppPdf, unsigned int *nCount);
类名。
指向 SEOSDB_PDF 指针(指向包含属性向量的已分配内存区域)的指针。
向量中的属性数。
seadmapi_GetEntity 和 seadmapi_GetExEntity 函数将数据库对象属性的所有值检索到 ObjPVs 向量中。
这些函数可供 CA ControlMinder 实用程序使用,并提供从数据库提取信息的便捷方法。 要使用这些函数,请先调用 seadmapi_InitEntityRuler 函数以初始化调用方关注的属性列表。 然后,调用 seadmapi_GetEntity 或 seadmapi_GetExEntity 函数以提取单个对象的信息。
注意:有关 rdbdump 实用程序的详细信息,请参阅《参考指南》。
在使用 seadmapi_GetEntity 函数时,向量将接收有关属性(属性说明)和属性值的所有信息。 将检索并存储所有属性,如同列表属性值一样。 单值属性也作为列表存储为一个条目。‑
在使用 seadmapi_GetExEntity 函数时,向量将接收同样的信息,除此之外,包含其他对象 ID 的所有属性值还会被扩展。 例如,函数将检索已扩展的 OID(包含 ID 以及所有者的类和名称),而不是接收所有者的 ID。
在使用信息之后,请调用 seadmapi_KillEntityMem 或 seadmapi_KillExEntityMem 函数以释放操作所需的所有内存。
用户可以通过之前对 seadmapi_MakePDFList 函数的调用来初始化 ObjPVs 向量。 ObjPVs 参数指向的向量应当包含属性名设置为 NULL 的最后一个元素。 这些函数使用此方法确定向量的大小。
SEOSDB_ENTDAT、SEOS_X_OID、SEOS_X_GCONN、SEOS_X_ACL 和 SEOS_X_PACL 结构在 seostypes.h 标头文件中定义。
在每次调用 seadmapi_GetEntity 或 seadmapi_GetExEntity 后,请确保您分别调用 seadmapi_KillEntityMem 或 seadmapi_KillExEntityMem 来释放 seadmapi_GetEntity 或 seadmapi_GetExEntity 函数分配的内存。
这些函数可以由具有以下任意属性的用户执行的进程进行调用:
Watchdog 和代理也可以使用这些函数。
如果函数成功,则返回 0;如果失败,则返回错误代码。
int seadmapi_GetEntity(const char *szCName, const char *szOName, SEOSDB_ODF *podf, SEOSDB_ENTDAT *ObjPVs); int seadmapi_GetExEntity(const char *szCName, const char *szOName, SEOSDB_ODF *podf, SEOSDB_ENTDAT *ObjPVs);
int seadmapi_InitEntityRuler(const char *szCName, SEOSDB_ENTDAT *ObjPvs);
void seadmapi_KillEntityMem(SEOSDB_ENTDAT *ObjPVs);
void seadmapi_KillExEntityMem(SEOSDB_ENTDAT *ObjPVs);
类名。
对象名称。
指向要使用对象说明进行填充的内存区域的指针。
指向带有属性说明和值列表的向量的指针。
示例
以下示例说明如何使用 seadmapi_InitEntityRuler 和 seadmapi_GetExEntity 函数。
/*========================================================= 项目 :eTrust 模块 :eTrust 版本:8.0 文件 :sample_TermOwn.c 目的 :显示终端所有者。 =========================================================== 版权: 版权所有 2004 Computer Associates International, Inc. ===========================================================*/ /* ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ 使用 UNIX 时,请记得通过输入以下命令 将环境变量指向共享库路径: setenv LD_LIBRARY_PATH/opt/CA/eTrustAccessControl/lib/ ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ */ #include <ctype.h> #include <stdio.h> #include <sys/types.h> #include <memory.h> #include <seadmapi.h> static int ErrorMessage( int rv ); int main(int argc, char *argv[]) { SEOSDB_ODF odf; /* 对象定义 */ SEOSDB_ENTDAT entdat[2]; /* 实体数据 */ SEOS_X_OID *owner; int rv; /* ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ */ /* 检查用户是否指定了终端名称。 */ /* ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ */ if ( argc == 1 ) { printf("Usage: '%s terminal_name'\n", argv[0]); return 1; } /* ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ */ /* 初始化实体数据。 */ /* ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ */ memset(entdat, 0, sizeof(entdat)); /* ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ */ /* 设置数据库请求的管理器。 */ /* ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ */ entdat[0].szPName = "OWNER"; /* 所有者 */ entdat[1].szPName = NULL; /* Null 终止符 */ rv = seadmapi_InitEntityRuler("TERMINAL", entdat); /* ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ */ /* 在无法设置管理器的情况下,退出并显示错误消息。*/ /* ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ */ if ( rv != 0 ) return ErrorMessage(rv); /* ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ */ /* 获取所有数据。 */ /* ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ */ rv = seadmapi_GetExEntity("TERMINAL", /* 类名 */ argv[1], /* 终端名称 */ &odf, /* 对象定义 */ entdat); /* 实体数据 */ /* ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ */ /* 在无法获取数据的情况下,退出并显示错误消息 */ /* ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ */ if ( rv != 0 ) return ErrorMessage(rv); /* ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ */ /* 显示 OWNER 信息。 */ /* ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ */ if ( entdat[0].nPVQty != 0 ) { owner = (SEOS_X_OID *)entdat[0].pPVList[0]; if ( owner‑>pCName != NULL ) printf("OWNER = %s %s, id=%d\n", owner‑>pCName, owner‑>pOName, owner‑>oid); else printf("OWNER = (id=%d)\n", entdat[0].pPVList); } else printf("OWNER = \n"); return 0; } /* ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ */ /* 显示错误消息。 */ /* ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ */ static int ErrorMessage( int rv ) { char msg_buff[1024]; seadmapi_GetMessage(rv, sizeof(msg_buff), msg_buff); fprintf(stderr, "%s.\n", msg_buff); return rv; }
此函数检索有关用户密码、上次登录日期以及用户仍然具有的宽限登录次数的信息。
此函数可以由具有 ADMIN 属性的用户执行的进程进行调用。
所有用户均可以根据需要执行此函数。
int seadmapi_GetGraceInfo(SEGRACE_RES *p_sgr);
指向包含有关用户登录和宽限天数信息的结构的指针。
UNIX 示例
以下示例说明如何在 UNIX 系统中使用 seadmapi_GetGraceInfo 函数。
/*========================================================= 项目 :eTrust 模块 :eTrust 版本:4.10 文件 :sample_grace.c 目的 :seadmapi 示例,显示 Access Control 数据库中有关用户 宽限登录次数的信息。 =========================================================== 版权: 版权所有 2004 Computer Associates International, Inc. ===========================================================*/ #include <ctype.h> #include <stdio.h> #include <sys/types.h> #include <seadmapi.h> int main(void) { SEGRACE_RES sgr; /*宽限信息结构 */ int rv; /*返回值 */ /*‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑*/ /* 如果内核扩展未运行,则退出。 */ /*‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑*/ rv = seossfr_IsSeOSSyscallLoaded(); if ( rv ) { fprintf(stderr, "The kernel extension is not loaded.\n"); return rv; } /*‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑*/ /* 如果安全后台进程未运行,则退出。 */ /*‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑*/ rv = seadmapi_IsServerRunning(); if ( rv ) {fprintf(stderr, "Security daemon is not running.\n"); return rv; } /*‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑*/ /* 将用户名设置为“0”以获取当前用户的 */ /* 宽限信息 */ /*‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑*/ sgr.uname[0] = 0; /*‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑*/ /* 从数据库中获取宽限信息。 */ /*‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑*/ rv = seadmapi_GetGraceInfo(&sgr); /*‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑*/ /* 如果 rv 不为零,则显示错误消息并退出。 */ /*‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑*/ if ( rv ) { if ( sgr.step ) { if (sgr.msg[0] != 0 ) fprintf(stderr, "%s\n", sgr.msg); return 1; } } /*‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑*/ /* 显示宽限登录次数。 */ /*‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑*/ printf("User %s has %d grace logins.\n", sgr.uname, sgr.grace); return 0; }
Windows 示例
以下示例说明如何在 Windows 环境中使用 seadmapi_GetGraceInfo 函数。
/*========================================================= 项目 :eTrust 模块 :eTrust 版本:4.10 文件 :sample_grace.c 目的 :seadmapi 示例,显示 Access Control 数据库中有关用户 宽限登录次数的信息。 =========================================================== 版权: 版权所有 2004 Computer Associates International, Inc. ===========================================================*/ #include <ctype.h> #include <stdio.h> #include <sys/types.h> #include <seadmapi.h> int main(void) { SEGRACE_RES sgr; /*宽限信息结构 */ int rv; /*返回值 */ /*‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑*/ /* 如果内核扩展未运行,则退出 */ /*‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑*/ rv = seossfr_IsSeOSSyscallLoaded(); if ( rv ) { fprintf(stderr, "The kernel extension is not loaded.\n"); return rv; } /*‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑*/ /* 将用户名设置为“0”以获取当前用户的宽限信息*/ /*‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑*/ sgr.uname[0] = 0; /*‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑*/ /* 从数据库中获取宽限信息。 */ /*‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑*/ rv = seadmapi_GetGraceInfo(&sgr); /*‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑*/ /* 如果 rv 不为零,则显示错误消息并退出。 */ /*‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑*/ if ( rv ) { if ( sgr.step ) { if (sgr.msg[0] != 0 ) fprintf(stderr, "%s\n", sgr.msg); return 1; } } /*‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑*/ /* 显示宽限登录次数。 */ /*‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑*/ printf("User %s has %d grace logins.\n", sgr.uname, sgr.grace); return 0; }
此函数提供将对象 ID 转换为包含对象名称的字符串的便捷方式。 如果数据库中不存在该对象(例如,对象已删除),则此函数返回的字符串为 NULL。
此函数返回的指针是指向静态区域的指针,该静态区域将被每个后续调用所覆盖。 因此,使用多线程时此函数不是很安全。‑
此函数可以由具有以下任意属性的用户执行的进程进行调用:
Watchdog 和代理也可以使用这些函数。
如果函数成功,则返回对象名称;如果失败,则返回 NULL。
char *seadmapi_OidToName(SEOS_OID oid);
记录的对象 ID。
此函数向引擎提供当前进程的相关信息。 此函数返回的信息可用于从数据库或授权引擎提取其他信息。
对于此函数,您应当了解以下信息:
如果函数成功,则返回 0;如果失败,则返回错误代码。
int seadmapi_WhoAmI(uid_t *uid, int *handle, char *szUName, SEOS_UMODE *objtype);
与当前进程关联的 UID。 在 UNIX 中,这与使用 getlogin UNIX 函数效果一样,甚至更安全。
与当前进程关联的 ACEE 句柄。 请参阅本部分中的“注意”。
与当前进程关联的用户名。
在数据库中保存的用户类型。 指定分配给用户的属性。
示例
以下示例说明如何使用 seadmapi_WhoAmI 函数。
/*========================================================= 项目 :eTrust 模块 :eTrust 版本:8.0 目的 :显示 Access Control 数据库 中的用户信息。 =========================================================== 版权: 版权所有 2004 Computer Associates International, Inc. ===========================================================*/ #include <ctype.h> #include <stdio.h> #include <sys/types.h> #include <seadmapi.h> int main(void) { SEOS_UMODE objtype; /* 对象类型 */ uid_t uID; /* 用户 ID */ char uName[256]; /* 用户名 */ int handle; /* 句柄 */ int regular = 1; /* 模式标志 */ int rv; /* ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ */ /* 从数据库中获取用户信息。 */ /* ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ */ rv = seadmapi_WhoAmI(&uID, &handle, uName, &objtype); /* ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ */ /* 如果失败,则显示消息并退出。 */ /* ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ */ if ( (rv != 0) || (uName[0] == '?') ) { fprintf(stderr, "Can't find current user name.\n", uName, rv); return 1; } /* ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ */ /* 显示用户信息: */ /* ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ */ printf("User Name : %s\n", uName); printf("User ID : %ld\n", uID); printf("User Handle : %ld\n", handle); /* ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ */ /* 通过使用 SEOS_UMODE_is 宏显示 */ /* 用户授权属性。 */ /* ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ */ printf("User Mode :"); if ( SEOS_UMODE_is_auditor(objtype) ) { printf(" AUDITOR"); regular = 0; } if ( SEOS_UMODE_is_operator(objtype) ) { printf(" OPERATOR"); regular = 0; } if ( SEOS_UMODE_is_admin(objtype) ) { printf(" ADMIN"); regular = 0; } if ( SEOS_UMODE_is_pwmanager(objtype) ) { printf(" PWMANAGER"); regular = 0; } if ( regular ) printf(" REGULAR\n"); else printf("\n"); return 0; }
seadmapi_WhoIs 函数提供有关指定用户的信息。 此函数从数据库中获取用户类型(属性)。 szUName 参数指向的内存区域必须足以容纳 255 个字符。
seadmapi.h 标头文件包含多个针对 objtype 变量数据运行的宏,用于确定用户是否具有特定属性。 这些宏具有 SEOS_UMODE_is_attribute 的常见表示法。 系统中的任何进程都可以调用此函数。
如果函数成功,则返回 0;如果失败,则返回错误代码。
int seadmapi_WhoIs(char *szUName, SEOS_UMODE *objtype);
与当前进程关联的用户名。
在数据库中保存的用户类型。 指定分配给用户的属性。
给定一个句柄后,seadmapi_GetACEE 检索相关的 ACEE 信息。 此函数也能够在 CA ControlMinder 中扫描当前为用户分配的所有 ACEE。 信息将加载到由此函数自己分配的内存区域中。 在 CLIENT_ACEE 结构中填充的信息包含给定 ACEE 的所有凭据。
对于此函数,您应当了解以下信息:
如果函数成功,则返回 0;如果失败,则返回错误代码。
int seadmapi_GetACEE(int hAcee, CLIENT_ACEE **ppAcee); void seadmapi_FreeAceeMemory(CLIENT_ACEE **ppAcee);
指向一个指针(已分配为指向 seadmapi_GetACEE 分配的存储区域)的指针。 函数 seadmapi_FreeAceeMemory 将接收此相同地址以释放分配的内存。
此函数从消息文件检索错误描述,并将其放入 buff 参数指向的缓冲区中。
系统中的每个进程都可以使用此函数。
如果函数成功,则返回 0;如果失败,则返回错误代码。
int seadmapi_GetMessage(int err_code, int size, char *buff);
由一个 CA ControlMinder 函数返回的错误代码。
缓冲区的大小(以字节为单位)。 通常,2 KB 的缓冲区已足够。
指向包含错误描述文本的缓冲区的指针。
此函数检索在当前进程的 ACEE 中存储的对象类型。 此信息可以与多个宏一起使用,以确定当前进程是否属于具有某个可分配给用户的特殊属性(ADMIN、AUDITOR、PWMANAGER 等等)的用户。
seadmapi.h 标头文件包含多个针对此变量数据运行的宏,用于确定用户是否具有特定属性。 这些宏具有 SEOS_UMODE_is_attribute 的常见表示法。
如果函数成功,则返回 0;如果失败,则返回错误代码。
int seadmapi_GetObjType(SEOS_UMODE *objtype);
指向 SEOS_UMODE 类型变量(从当前进程的 ACEE 进行填充)的指针。
示例
以下示例说明如何使用 seadmapi_GetObjType。
/*========================================================= 项目 :eTrust 模块 :eTrust 版本:8.0 文件 :mymode.c 目的 :seadmapi_GetObjType 示例 显示用户的模式: REGULAR AUDITOR ADMIN OPERATOR SERVER 或 PWMANAGER。 =========================================================== 版权: 版权所有 2004 Computer Associates International, Inc. ===========================================================*/ #include <stdio.h> #include <seostype.h> #include <seadmapi.h> int main(void) { int rv; SEOS_UMODE umode; if ( (rv = seadmapi_GetObjType(&umode)) == 0) { printf("My mode is 0x%x : ", umode); if ( umode != 0 ) { if ( umode & SEOS_UMODE_AUDITOR ) printf("Auditor "); if ( umode & SEOS_UMODE_OPERATOR ) printf("Operator "); if ( umode & SEOS_UMODE_ADMIN ) printf("Admin "); if ( umode & SEOS_UMODE_SERVER ) printf("Server "); if ( umode & SEOS_UMODE_PWMANAGER ) printf("PwManager "); } else printf("Regular "); printf("\n"); return 0; } fprintf(stderr, "Error 0x%X for seadmapi_GetObjType.\n", rv); return 1; }
此函数初始化 CA ControlMinder 中的通信通道。
系统中的每个进程都可以使用此函数。 在 Windows 环境中不使用此函数。
您必须先调用 seadmapi_init 或 seadmapi_IsSeOSSyscallLoaded 函数,然后才能在 seadmapi 库中调用任何其他函数。 但是,如果同时使用这两个函数,则必须先使用 seadmapi_init,然后再使用 seadmapi_IsSeOSSyscallLoaded。
如果初始化成功,则此函数返回 0;如果失败,则返回错误代码。 它可以确认在计算机上加载的确切 CA ControlMinder 系统调用。
int seadmapi_init(void)
此函数检查是否加载了 CA ControlMinder 系统调用。 对于 Solaris、HP-UX 和 Linux 系统,此函数可解析动态 CA ControlMinder 系统调用号。
系统中的每个进程都可以使用此函数。 在 Windows 环境中不使用该函数。
对于除 AIX 以外的所有 UNIX 系统,如果函数成功,则返回 0;如果失败,则返回错误代码。
在 AIX 系统上,函数始终返回 0,因为 AIX 系统加载器无法加载任何需要先加载 CA ControlMinder 系统调用的进程,除非确实加载了系统调用。
int seadmapi_IsSeOSSyscallLoaded(void)
注意:必须先调用 seadmapi_init 或 seadmapi_IsSeOSSyscallLoaded 函数,然后才能在 seadmapi 库调用任何其他函数。
seadmapi_SendAuditRecord 函数向审核日志发送任意类型的审核信息。 此 API 提供的其他函数可在内部使用此函数以向日志文件提交特定类型的审核日志记录。 建议您使用针对每种审核记录类型的特定函数,而不是使用此函数,虽然在某些情况下使用此函数可能比较容易。
对于此函数,您应当了解以下信息:
Watchdog 和代理也可以使用这些函数。
如果函数成功,则返回 0;如果失败,则返回错误代码。
int seadmapi_SendAuditRecord(int type, int result, void *data);
审核记录的类型。 有关有效值的列表,请参阅 selogtype.h 标头文件。
CA ControlMinder 支持的有效结果代码之一。 有关有效值,请参阅 selogtype.h 标头文件。
指向审核记录数据的指针。 该指针必须根据提交的记录类型指向有效的数据。
这些函数向审核日志发送审核记录。 函数使用 seadmapi_SendAuditRecord 函数。 建议您使用这些函数,而不是直接调用 seadmapi_SendAuditRecord 函数。
以下是 seadmapi_SendAudit 函数:
以管理记录格式向审核日志发送审核记录。
以服务连接记录格式向审核日志发送审核记录。
以常规资源记录格式向审核日志发送审核记录。
以 TCP/IP 记录格式向审核日志发送审核记录。
以登录事件记录格式向审核日志发送审核记录。
以关闭记录格式向审核日志发送审核记录。
以启动记录格式向审核日志发送审核记录。
仅在 UNIX 上有效
以用户记录格式向审核日志发送审核记录。
以 Watchdog 记录格式向审核日志发送审核记录。
CA ControlMinder 针对审核信息使用压缩算法。 因此,在填入信息之前应使用 0 初始化该结构。 通过调用每个系统的标准 C 库所提供的 memset 函数,可以初始化该结构。
此函数可以由具有以下任意属性的用户执行的进程进行调用:
Watchdog 和代理也可以使用这些函数。
如果函数成功,则返回 0;如果失败,则返回错误代码。
指向包含事件特定数据的结构的指针。‑
CA ControlMinder 支持的有效结果代码之一。 有关有效结果代码的列表,请参阅 selogtype.h 标头文件。
这些函数向审核日志发送通知记录。 函数使用 seadmapi_SendAuditRecord 函数。 建议您使用这些函数,而不是直接调用 seadmapi_SendAuditRecord 函数。 针对具有需要通知事件的关联用户的资源(NOTIFY 属性),生成通知记录。
以下是 seadmapi_SendNotificationAudit 函数:
以管理记录格式向审核日志发送通知记录。
以服务连接记录格式向审核日志发送通知记录。
以常规资源记录格式向审核日志发送通知记录。
以 TCP/IP 记录格式向审核日志发送通知记录。
以登录事件记录格式向审核日志发送通知记录。
以关闭记录格式向审核日志发送通知记录。
以启动记录格式向审核日志发送通知记录。
仅在 UNIX 上有效
以用户记录格式向审核日志发送通知记录。
以 Watchdog 记录格式向审核日志发送通知记录。
CA ControlMinder 针对审核信息使用压缩算法。 因此,在填入信息之前应使用 0 初始化该结构。 通过调用每个系统的标准 C 库所提供的 memset 函数,可以初始化该结构。
此函数可以由具有以下任意属性的用户执行的进程进行调用:
Watchdog 和代理也可以使用这些函数。
如果函数成功,则返回 0;如果失败,则返回错误代码。
指向包含事件特定数据的结构的指针。‑
CA ControlMinder 支持的有效结果代码之一。 有关有效结果代码的列表,请参阅 selogtype.h 标头文件。
Watchdog 和代理使用此函数放置追溯信息,以记录可能的错误或故障。‑ 错误描述对于错误日志文件中的所有错误记录都通用。
如果函数成功,则返回 0;如果失败,则返回错误代码。
int seadmapi_SendErrorLog(SEOS_REQ_ERRORDESCP *rec);
指向包含错误描述和追溯数据的结构的指针。‑
进程使用此函数控制其审核级别和安全。 任何进程都可以调用此函数,以便为所有操作打开审核功能或删除与进程关联的凭据。 使用 flags 参数时,进程可以控制这些值。 flags 参数可以包含下表中介绍的任何值或其按位 OR 值。‑
当前支持以下标志:
删除其 ACEE 并使用未定义到 CA ControlMinder 的用户凭据的进程请求。 新的 NULL 凭据分配给进程及任意子进程。
对进程及其子进程发出的每个请求进行审核的请求。
senone 实用程序使用此函数;系统中的每个进程都可以调用它。
如果函数成功,则返回 0;如果失败,则返回错误代码。
int seadmapi_ProcessControl(unsigned long flags);
一个或多个按位值。‑
这些函数控制跟踪日志记录。 跟踪函数用于帮助诊断问题以及帮助了解 CA ControlMinder 的行为。
所有函数都将在调用后返回跟踪状态。 值为 1 表示已启用跟踪,值为 0 表示已禁用跟踪。 如果为任意这些函数指定的 CurrStatus 参数为 NULL,则函数不填入跟踪的当前状态。
这些函数与 secons 实用程序的 ‑t 选项提供相同功能。
对于此函数,您应当了解以下信息:
如果函数成功,则返回 0;如果失败,则返回错误代码。
int seadmapi_consTraceClear(int *CurrStatus); int seadmapi_consTraceDisable(int *CurrStatus); int seadmapi_consTraceEnable(int *CurrStatus); int seadmapi_consTraceGetStatus(int *CurrStatus); int seadmapi_consTraceToggle(int *CurrStatus);
调用后的跟踪的状态。
这些函数对用户并发登录设置执行操作。 函数执行以下操作:
用户通过 uid 参数进行标识。
这些函数与 secons 实用程序的 ‑d 和 ‑u 选项提供相同功能。
seadmapi_consUidLoginDisable 函数禁用指定用户 ID 的并发登录。 seadmapi_consUidLoginEnable 函数重新启用指定用户 ID 的并发登录。
seadmapi_consUidLoginGetStatus 函数检索授权后台进程所提供的用户并发登录设置的状态。
对于此函数,您应当了解以下信息:
如果函数成功,则返回 0;如果失败,则返回错误代码。
int seadmapi_consUidLoginDisable(int uid); int seadmapi_consUidLoginEnable(int uid); int seadmapi_consUidLoginGetStatus(int uid, nt *CurrStatus);
函数执行操作的用户 ID。
用户并发登录设置的当前状态。
这些函数控制用户登录系统的能力。 如果已禁用登录,则在 CA ControlMinder 运行时不允许任何用户登录系统。
这些函数与 secons ‑L 选项提供相同功能。
对于此函数,您应当了解以下信息:
如果函数成功,则返回 0;如果失败,则返回错误代码。
int seadmapi_consAllLoginDisable(void); int seadmapi_consAllLoginEnable(void); int seadmapi_consAllLoginGetStatus(int *CurrStatus);
系统范围内的禁用登录标志的当前状态。‑
此函数刷新内核运行时表中主机名到 IP 地址的解析。
如果函数成功,则返回 0;如果失败,则返回错误代码。
注意:此函数只可以由具有 ADMIN 属性的用户进行调用。
int seadmapi_ReloadIni(unsigned int* puiNumberOfRefreshedResources);
当函数成功完成时,将包含已刷新的资源数目。
此函数检索 seosd 的运行时统计信息。 可以使用 secons 实用程序查看此信息。 该信息放置在 rtsStat 参数指向的结构中。 此结构包含以下信息:
拒绝的 TCP/IP 请求数目。
允许的 TCP/IP 请求数目。
由于错误而无法解析的 TCP/IP 请求数目。
队列中未写入的审核记录数。
队列中未写入的错误记录数。
上次使用的对象 ID。
上次使用的属性 ID。
上次使用的类 ID。
数据库中的类数。
数据库中的属性数。
数据库中的对象(记录)数。
属性值数据库中的记录数。‑
当前使用的 ACEE 条目数。
受保护的客户端数。 (此字段保留供将来使用。)
缓存中加载的受信任程序数。
在缓存中标记为不受信任的程序数。‑
此函数与 secons 实用程序的 ‑i 选项提供相同信息。
对于此函数,您应当了解以下信息:
如果函数成功,则返回 0;如果失败,则返回错误代码。
int seadmapi_consRunTimeStatisticsGet(SEADMAPI_RTSTAT *rtsStat);
包含运行时统计信息的结构,如描述中所述。‑
此函数将消息提交到 CA ControlMinder 跟踪。
此函数与 secons 实用程序的 ‑m 选项提供相同功能。
任何进程都可以调用此函数。
如果函数成功,则返回 0;如果失败,则返回错误代码。
int seadmapi_consMessageSend(const char *szMessage);
要放入跟踪日志中的消息的字符串。
此函数导致 CA ControlMinder 退出并禁用组成 CA ControlMinder 基本配置的三个后台进程-seosd、seoswd 和 seagent。 (seagent 也称为代理。)在关闭 CA ControlMinder UNIX 后台进程(Windows 服务)后,内核扩展仍然处于加载状态,但不活动,直到再次执行 seosd 为止。 这将禁用 CA ControlMinder 提供的所有保护。
在 UNIX 中,属于 CA ControlMinder 一部分的其他后台进程(如 serevu、selogrd 和 selogrcd)不受此函数影响。 可以显式终止这些进程。
seadmapi_consShutdown 函数与 secons 实用程序的 ‑s 选项提供相同功能。
此函数只可以由具有 ADMIN 或 OPERATOR 属性的用户进行调用。
如果函数成功,则返回 0;如果失败,则返回错误代码。
int seadmapi_consShutdown(void);
此函数重新加载 seosd 后台进程的配置标记。 这些标记位于 seos.ini 文件中。 实际上,后台进程仅使用一部分新重新加载的标记。
此函数只可以由具有 ADMIN 或 OPERATOR 属性的用户进行调用。
如果函数成功,则返回 0;如果失败,则返回错误代码。
int seadmapi_ReloadIni(void);
sepass_ReplacePassword 函数可使用新密码替换用户密码。
假定用户在本地定义,并且在 domainCode 参数中未提供 SEPASS_API_DOMAIN_PMD,sepass_ReplacePassword 将替换本地 UNIX 文件中的用户密码。
可以根据以下条件替换密码:
int sepass_ReplacePassword (char *userName, char *oldPasswd, char *newPasswd, char *szPmd, char* szMsg, int msgLen, int domainCodes, int debug, int ignoreRules, int keep_grace, int do_as_user, int onlySeOS, int ChangeGrace);
包含要替换其密码的用户的名称、以 NULL 结尾的字符串。‑
包含调用函数的指定用户或管理员的当前(旧)密码、以 NULL 结尾的字符串。‑
包含新(所需)密码、以 NULL 结尾的字符串。‑
包含要在其上更改密码模型(如果有)的策略模型的名称、以 NULL 结尾的字符串。‑
指向将在其中存储成功或失败消息的缓冲区的指针。
消息缓冲区的大小。
这些值之一:
指示应当输出的详细说明的标志。
此参数的值可以为以下三个值之一:
在更改密码后重置用户的宽限属性。
像指定用户更改密码一样更改密码,而不是作为管理更改。
此参数的值可以为以下两个值之一:
1-只在 CA ControlMinder 环境中更改密码;
0-在 UNIX 和 CA ControlMinder 环境中更改密码。
将用户的登录宽限期设置为指定天数。
-1 => 使用默认值 (1)。
在数据库中,每个属性都具有自己的数据类型。 在数据库中定义的某些数据类型很简单,如字符串或整数值;其他数据类型是带多个字段的结构。
以下部分将说明主要的数据结构和数据类型。
CA ControlMinder 在数据库中定义和保存的每个数据类型都具有使用以下命名约定定义的符号常量:
SEOSDB_PTYPE_Access_Control_data_type
例如,类型 SEOS_OID 具有符号常量 SEOSDB_PTYPE_OID。
ASCII‑Z 字符串。 通过最大字符串长度确定的属性大小。
数据库中的对象 ID。
日期和时间。 (格式为 time_t。)
整数,大小为 1、2 或 4 个字节。 属性大小决定实际类型。
不带符号的整数,大小为 1、2 或 4 个字节。 属性大小决定实际类型。
用户模式,即用户是否为 ADMIN、AUDITOR 等。 此值作为位字段存储为整数。
用户与组的连接信息。
允许的访问类型。 访问权限是 32 位字段值。‑
ACL 条目。
程序条件 ACL 条目。
用户帐户的审核触发器。 这是一个位字段值。
针对资源访问权限的日期和时间限制。
文件特征的受信任程序信息。
HOST 或其他 Internet 类的 ACL 条目。
资源的审核触发器。 这是一个 16 位字段值。‑
表示布尔值的不带符号的字符。
IP 地址的掩码和匹配值的组合。
TCP/IP 服务范围 ACL 条目。
在这些结构的每个数据成员中存储的信息和值列在 seostypes.h 文件中。 在某些情况下,结构只是单个值或同一类型的条目列表。 例如,ACL 是 0 个或多个 ACL 条目的列表。 用户所连接到的组的列表是 SEOS_GCONN 结构的列表。 后者还表示实体相互指向的情况。 用户对象具有所连接到的组的列表。 组具有所连接用户的列表。
注意:有关每一类中各个属性的完整说明,请参阅《selang 参考指南》。
以下列表简要介绍了管理 API 函数的数据库结构和数据类型:
包含给定 ACEE 的信息
包含运行时统计信息
包含宽限登录信息
包含访问标志的列表
包含 ACL 的列表
包含类标识描述符
包含用户连接到的组的列表以及用户具有的与各个组相关的属性(如果有)
包含对象标识描述符
包含属性标识描述符
包含 ACL 的列表,其中含有比 SEOS_ACL 更多的信息
类似于 SEOS_GCONN,但是包含更多信息
包含扩展的对象标识描述符
包含扩展的 PACL 列表
包含数据库中特定类的定义
包含有关数据库中属性的信息
包含数据库中特定对象的定义
包含数据库中特定属性的定义
CA ControlMinder 使用二进制压缩文件来存储审核和错误日志记录。 日志文件由每个记录的固定部分和可变长度部分组成。‑ 固定部分包含一些常用数据(类似于记录提交时间)及可变长度部分的大小和类型。‑ CA ControlMinder 定义不同审核记录的若干结构。 当前版本的 CA ControlMinder 提供以下审核记录。
以下结构可供管理 API 和 LogRoute API 使用。
CA ControlMinder 更新和语言解析器接口请求
CA ControlMinder 后台进程和服务关闭事件
常规资源审核事件
CA ControlMinder TCP/IP 事件审核信息
登录事件和密码事件审核记录
CA ControlMinder 后台进程和服务启动事件
已审核用户的跟踪记录
用于将受信任程序标记为不受信任程序的 Watchdog 审核记录
CA ControlMinder 错误追溯信息‑
所有这些结构都在标头文件 selogtype.h 中定义。
CLIENT_ACEE 结构包含给定 ACEE 的信息。 相应字段如下:
ACEE 的句柄。
组连接的数目。
组连接数组。
类别数目。
类别名称数组。
安全标签。
用户名。
用户的审核模式。
用户的安全级别。
源终端。
ACEE 的进程计数。
用户的模式。
ACEE 的创建时间。
SEADMAPI_RTSTAT 结构包含从 seadmapi_consRunTimeStatisticsGet 函数检索到的信息。
相应字段如下:
拒绝的 inet 请求数目。
允许的 inet 请求数目。
包含错误的 inet 请求数目。
审核日志队列大小。
错误日志队列大小。
数据库中的第一个可用对象 ID。
数据库中的第一个可用属性 ID。
数据库中的第一个可用类 ID。
数据库中的类数。
数据库中的属性数。
数据库中的对象数。
数据库中的属性值数。
系统中当前的 ACEE 句柄数。
受保护的客户端数。
数据库中当前受信任的程序数。
数据库中当前不受信任的程序数。
SEGRACE_RES 结构包含由 seadmapi_GetGraceInfo 函数检索的信息。
相应字段如下:
表示结构中所包含信息类型的整数。 值包括:
没有可显示的数据。
向用户显示警告,例如用户剩余的宽限天数或用户密码到期前的天数。
用户的密码已到期;必须立即替换。
向用户显示的消息。
包含有关用户上次登录信息的消息。
用户剩余的宽限登录次数。
用户必须更换密码前的天数。
已为其完成查询的用户的名称。
SEOS_ACL 结构介绍访问者获得的访问权限。
相应字段如下:
访问者的对象 ID。
用户对资源的访问级别。
SEOS_GCONN 结构包含用户连接到的组的列表,以及用户具有的与这些组相关的特殊属性(如果有)。
相应字段如下:
组的对象 ID。
连接的所有者。
建立连接的日期和时间。
组中用户的属性。
SEOS_PACL 结构包含条件访问控制列表的列表。
相应字段如下:
访问者的对象 ID。
受信任程序的对象 ID。
用户对资源的访问级别。
SEOS_REQ_ERRORDESCP 结构包含发送至审核日志的信息。
相应字段如下:
发送错误记录的模块的编号。
错误代码。
发送错误记录的模块的名称。
错误的源文件。
发现错误时所处的阶段。
错误的重要级别。
SEOS_X_ACL 结构是 SEOS_ACL 结构的扩展版本。
相应字段如下:
访问者的对象 ID。
用户对资源的访问级别。
访问者所属的类。
访问者姓名。
SEOS_X_GCONN 结构是 SEOS_GCONN 结构的扩展版本。
相应字段如下:
组的对象 ID。
连接的所有者。
建立连接的日期和时间。
组中用户的属性。
组名称。
作者姓名。
SEOS_X_PACL 结构是 SEOS_PACL 结构的扩展版本。
相应字段如下:
访问者的对象 ID。
受信任程序的对象 ID。
用户对资源的访问级别。
类名。
对象名称。
允许通过其进行访问的程序名称。
SEOSDB_CDF 结构包含数据库中特定类的定义。
相应字段如下:
类的 ID。
类的名称。
类的标志。
保留供将来使用。
保留供将来使用。
保留供将来使用。
SEOSDB_ENTDAT 结构包含 seadmapi_GetEntity 和 seadmapi_GetExEntity 函数返回的信息。
相应字段如下:
属性名。
对象类的类 ID。
对象的属性 ID。
属性的标志。
属性大小。
保留供将来使用。
保留供将来使用。
保留供将来使用。
pPVList 中的值数目。
值列表。
在函数无法返回请求数据的情况下的错误代码。
SEOS_X_OID 数据类型是 SEOS_OID 数据类型的扩展版本。
相应字段如下:
作为不带符号的长整数的记录的对象 ID。
对象的类。
对象的名称。
版权所有 © 2013 CA。
保留所有权利。
|
|