上一主题: 编程指南下一主题: IR API


数据库组织

数据库中的信息按照类进行组织。 类的定义包括该类的所有记录或对象通用的信息。 属于同一类的记录具有相似含义。 例如,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 参考指南》。

数据库布局

数据库由以下数据文件组成:

seos_cdf.dat

类说明文件包含类定义表。

seos_odf.dat

对象说明文件包含记录定义表。

seos_pdf.dat

属性说明文件包含属性定义表。

seos_pvf.dat

属性值文件包含为每个 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 中的每个条目都定义了数据库中的访问者对象对资源拥有的访问权限。 每个 ACL 条目包括:

该条目决定了允许访问者对由该资源记录表示的资源执行的操作。

CA ControlMinder 也提供程序访问控制列表 (PACL),也称为条件 ACL,其类似于常规 ACL。 除访问者的记录 ID 和访问者的授权级别之外,PACL 条目还包括 PROGRAM 记录 ID。

按照约定,CA ControlMinder 不会将为零的对象 ID 分配给任何对象。 在 ACL 和 PACL 中,为零的对象 ID 表示用户 (*)-也就是说,所有 CA ControlMinder 定义的用户。

注意:有关 ACL 的详细信息,请参阅《selang 参考指南》中的 authorize 命令。

了解 ACEE

在用户登录系统时,CA ControlMinder 将访问者环境元素 (ACEE) 分配给每个用户。 ACEE 是包含用户凭据和各种安全参数定义的数据结构。 由登录过程所创建的每个进程将继承父进程的 ACEE。 即使该进程通过执行系统的 su 实用程序或 sesu 实用程序来替代用户,也会维护 ACEE。

每个 ACEE 都有句柄,可以随时唯一地介绍进程的凭据和其他信息。 ACEE 及其关联的句柄始终存在,直到创建它们的登录会话终止。

管理 API 和所有 CA ControlMinder 授权过程使用 ACEE 句柄来标识和介绍发出请求的用户。

管理 API 包含提取用户的 ACEE 或 ACEE 句柄的函数。 在 UNIX 中,可以使用具有相应选项的 sewhoami 实用程序查看由这些函数所获取的信息。

注意:有关 sewhoami 实用程序的详细信息,请参阅《参考指南》。

API 的范围限制

与 CA ControlMinder 语言解释器相比,管理 API 使用更简单的安全范围方法,以免对性能产生负面影响。

管理 API 使用在用户的 USER 记录中设置的属性,但是忽略使用所有权、组属性和 ADMIN 类的其他权限。 这表示用户无法使用管理 API 执行某些操作,但是这些操作可以通过使用 selang、selangx、CA ControlMinder 管理员 (seadm) 或策略管理器执行。 例如,在 selang 中,用户可以显示或更新用户拥有的对象。 但是,除非对象的所有者也有 ADMIN 属性,否则管理 API 不允许该所有者进行更新。

约定

管理 API 使用以下约定:

标头文件

要使用此 API,需要在源代码中包含具有原型和结构定义的标头文件。 所有原型都在 seadmapi.h 文件中,而大多数数据类型在其他标头文件中。 seostype.h 标头文件提供存储在数据库中的所有数据的结构定义。 审核日志记录和错误日志记录的结构定义位于标头文件 selogtype.h 中。

本部分讨论必须使用此 API 的库。

在 UNIX 中

seadmapi 包括单个库文件 seadmapi.a,它应与使用此 API 的每个已编译的源文件链接。

CA ControlMinder 包括名为 ibseadmapi.xx 的此 API 的共享库版本,其中 xx 是共享库名称的标准操作系统约定(通常为 so 或 sl)。 在执行使用共享库的程序(如 sample_TermOwn.c)之前,请检查环境变量是否指向共享库的路径。 要将环境指向共享路径,请输入:

setenv LD_LIBRARY_PATH /opt/CA/AccessControl/lib
在 Windows 中

要使用 seadmapi 函数编译和链接程序,请确保链接路径中包含静态库 seadmapi.lib。 通常可以在 ACDir\lib(其中,ACDir 是您安装 CA ControlMinder 的目录,默认情况下为 C:\Program Files\CA\Access Control)中找到此库。

在执行使用此库的程序之前,请检查环境变量是否指向库的路径。

使用 seadmapi 编译和链接

使用 seadmapi 编译不需要任何特殊标志。 相反,链接可能需要其他设置。 遗憾的是,这些标志依赖于计算机和操作系统。 使用由该 API 示例提供的 makefile,并查看这些示例了解最新信息。‑‑

编程说明

重要说明! 为避免死锁,请不要在 seosd exit 中使用任何管理 API 函数。

由此 API 提供的所有函数都是线程安全的函数。‑ 如果函数不是线程安全的函数,则该函数的“说明”部分会指出该事实。‑

注意:必须先调用 seadmapi_init 或 seadmapi_IsSeOSSyscallLoaded 函数,然后才能在 seadmapi 库调用任何其他函数。

函数

管理 API 包括分为以下类别的函数:

类操作

以下函数对 CA ControlMinder 类执行操作:

seadmapi_ClassGetEqual

检索数据库中的特定类。

seadmapi_ClassGetFirst

检索数据库中的第一个类。

seadmapi_ClassGetNext

检索数据库中的下一个类。

属性操作

以下函数对属性执行操作:

seadmapi_PropGetEqual

检索特定属性的说明。

seadmapi_PropGetFirstInClass

检索类的第一个属性说明。

seadmapi_PropGetNextInClass

检索类的下一个属性说明。

对象操作

以下函数对对象执行操作:

seadmapi_FreeObjList

释放由 ObjInClassList 检索的对象的列表。

seadmapi_ObjGetEqual

检索特定对象的信息。

seadmapi_ObjGetFirstInClass

检索类中第一个对象的信息。

seadmapi_ObjGetGreaterEqual

检索对象 ID 大于或等于指定对象 ID 的对象的信息。

seadmapi_ObjGetNextInClass

检索类中下一个对象的信息。

seadmapi_ObjInClassList

检索指定类中的对象的列表。

值操作

以下函数对值执行操作:

seadmapi_FetchListPropVal

获取列表类型属性的值。

seadmapi_FetchSinglePropVal

获取单值属性的值。

seadmapi_FreeListPropVal

释放 FetchListPropVal 中值的列表。

seadmapi_SetSinglePropVal

设置单个属性值类型的值。

查询操作

以下函数执行查询:

seadmapi_GetEntity

使用之前已初始化的实体管理器检索整个对象及其属性值。

seadmapi_GetExEntity

使用之前已初始化的实体管理器检索整个对象及其属性值,包括对象名和类名。

seadmapi_GetGraceInfo

检索关于用户的宽限信息。

seadmapi_InitEntityRuler

初始化用于 GetEntity 和 GetExEntity 操作的实体查询缓冲区。

seadmapi_KillExEntityMem

释放由 InitEntityRuler 函数为实体样式查询分配的内存。

seadmapi_KillPDFList

释放由 MakePDFList 函数分配的属性描述符的列表。

seadmapi_MakePDFList

从属性名列表创建属性描述符列表。

seadmapi_OidToName

将对象 ID 转换为对象名。

日志文件接口

以下函数对日志文件执行操作:

seadmapi_SendAdminAudit

提交 ADMIN 审核记录。

seadmapi_SendAuditRecord

提供用于提交审核记录的接口。

seadmapi_SendCwsAudit

提交服务连接的资源审核记录。

seadmapi_SendErrorLog

将说明提交到错误日志。

seadmapi_SendGenrAudit

提交常规资源审核记录。‑

seadmapi_SendInetAudit

提交 TCP/IP 审核记录。

seadmapi_SendLoginAudit

提交登录审核记录。

seadmapi_SendShutdownAudit

提交关闭的审核记录。

seadmapi_SendStartupAudit

提交启动的审核记录。

seadmapi_SendUserAudit

提交用户审核记录。

seadmapi_SendWatchdogAudit

提交 watchdog 审核记录。

seadmapi_SendNfAdminAudit

提交 ADMIN 通知记录。

seadmapi_SendNfCwsAudit

提交服务连接的资源通知记录。

seadmapi_SendNfGenrAudit

提交常规资源通知记录。‑

seadmapi_SendNfInetAudit

提交 TCP/IP 通知记录。

seadmapi_SendNfLoginAudit

提交登录通知记录。

seadmapi_SendNfShutdownAudit

提交关闭的通知记录。

seadmapi_SendNfStartupAudit

提交启动的通知记录。

seadmapi_SendNfUserAudit

提交用户通知记录。

seadmapi_SendNfWatchdogAudit

提交 watchdog 通知记录。

控制台操作

以下函数提供控制台操作:

seadmapi_consAllLoginDisable

禁用所有系统登录。

seadmapi_consAllLoginEnable

启用所有系统登录。

seadmapi_consAllLoginGetStatus

获取全局登录控件的状态。‑

seadmapi_consMessageSend

将消息发送到 CA ControlMinder 跟踪。

seadmapi_consRefreshIPAddresses

刷新主机名到主机 IP 地址的解析。

seadmapi_consRunTimeStatisticsGet

获取运行时统计信息。

seadmapi_consShutdown

关闭 CA ControlMinder。

seadmapi_consTraceClear

清除跟踪文件。

seadmapi_consTraceDisable

禁用 CA ControlMinder 跟踪。

seadmapi_consTraceEnable

启用 CA ControlMinder 跟踪。

seadmapi_consTraceGetStatus

返回 CA ControlMinder 跟踪的状态。

seadmapi_consTraceToggle

切换 CA ControlMinder 跟踪。

seadmapi_consUidLoginDisable

禁用用户 ID 的登录。

seadmapi_consUidLoginEnable

启用用户 ID 的登录。

seadmapi_consUidLoginGetStatus

获取 UID 并发登录状态。

杂项操作

以下函数执行不属于以上任何类别的函数:

seadmapi_FreeAceeMemory

释放由 seadmapi_GetACEE 函数分配的内存。

seadmapi_GetACEE

检索当前进程用户的 ACEE。

seadmapi_GetMessage

使用 CA ControlMinder 消息文件从给定的错误代码中检索错误字符串。

seadmapi_GetObjType

检索当前进程用户类型的信息。

seadmapi_init

初始化 CA ControlMinder 中的通信通道。

seadmapi_IsSeOSSyscallLoaded

确定是否加载了 CA ControlMinder 系统调用。

seadmapi_ProcessControl

提供对当前进程的控制。

seadmapi_WhoAmI

检索当前进程的信息

seadmapi_WhoIs

检索关于用户的属性信息。

sepass_ReplacePassword

用新密码替换用户密码。

seadmapi_ClassGet 函数

这些函数检索数据库中定义的类的信息。

要扫描数据库中的所有类,请先调用 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);
szClass

要检索其信息的类的名称。 如果在 cid 参数中指定类 ID,请将该参数设置为 NULL。

cid

要检索其信息的类的类 ID。 如果为 szClass 参数指定类名,请将该参数设置为 ‑1。

p_seclass

指向包含函数所检索信息的结构的指针。 对于 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_PropGet 函数

这些函数检索数据库中定义的一个或多个属性的信息。

要扫描特定类中的所有属性,请先调用 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);
szClass

类名。 指定类说明而非类名时,请将该参数设置为 NULL。

p_seclass

类说明。 指定类名而非类描述符时,请将该参数设置为 NULL。 注意,该参数为 NULL 时,szClass 不得为 NULL。

szProp

属性名。 指定属性 ID 而非属性名时,请将该参数设置为 NULL。

pid

属性 ID。 指定属性名而非属性 ID 时,请将该参数设置为 ‑1。

p_seprop

指向包含函数所检索信息的数据结构的指针。

示例

以下示例说明如何使用 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_ObjGet 函数

这些函数检索数据库中对象(记录)的信息。

这些函数可以由具有以下任意属性的用户执行的进程进行调用:

Watchdog 和代理也可以使用这些函数。

seadmapi_ObjGetGreaterEqual 函数返回以下值之一:

0

此函数检索其对象 ID 等于指定对象的对象 ID 的对象信息。

1

此函数检索其对象 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);
szClass

对象所属的类的名称。 如果使用 p_seclass 参数指定类,请将该参数设置为 NULL。

p_seclass

指向包含类描述符的结构的指针。 如果指定 szClass 参数,请将该参数设置为 NULL。

szObj

要提取其值的对象的名称。 如果指定对象 ID 而非对象名称,请将该参数设置为 NULL。

oid

要检索其信息的对象的对象 ID。 如果指定对象名称而非对象 ID,请将该参数设置为 ‑2。

p_seobj

指向包含函数所检索信息的结构的指针。

示例

以下示例说明如何使用 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_ObjInClassList 函数

seadmapi_ObjInClassList 函数检索指定类中的对象列表。

字段 SEADMAPI_MAXOBJSLIST 指定可在单个调用中检索的条目数的限制。

在调用此函数后,您应当调用 seadmapi_FreeObjList 函数来释放为查询分配的内存。 使用此函数返回的 ptr 参数。

如果函数成功,则返回 0;如果失败,则返回错误代码。

int seadmapi_ObjInClassList (SEOSDB_CDF  *pcdf,     
                    char        *start,     
                    void        **ptr,     
                    char        **names,     
                    int         *count);
pcdf

指向类说明的指针。

start

表示列表开头的对象名称的字符串。

ptr

指向“void *”的指针,用于释放为列表查询分配的内存。

names

指向 char 指针向量的指针。 每个元素都指向一个对象名称。

count

进入时,指的是名称向量的大小。 返回时,指的是向量中的条目数。

seadmapi_FreeObjList 函数

seadmapi_FreeObjList 函数释放 seadmapi_ObjInClassList 函数分配的内存。

此函数向 *ptr 分配 NULL。

没有返回值。

int seadmapi_FreeObjList (void **ptr);
ptr

最近通过调用 seadmapi_ObjInClassList 函数获取的指针。

更多信息:

seadmapi_ObjInClassList 函数

seadmapi_FetchListPropVal 函数

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);
szClass

对象所属的类的名称。 如果通过 p_seclass 参数标识类,请将该参数设置为 NULL。

p_seclass

指向包含类说明的结构的指针。 如果通过 szClass 参数标识类,请将该参数设置为 NULL。

szObj

要提取其属性值的记录的名称。 如果通过 p_seobj 参数标识对象,请将该参数设置为 NULL。

p_seobj

指向包含对象说明的结构的指针。 如果通过 szObj 参数标识对象,请将该参数设置为 NULL。

szProp

要提取其值的属性的名称。 如果通过 p_seprop 参数标识属性,请将该参数设置为 NULL。

p_seprop

指向包含属性说明的结构的指针。 如果通过 szProp 参数标识属性,请将该参数设置为 NULL。

val

指向提取的值类型的指针的指针。 有关详细信息,请参阅此列表下的说明。

psize

提取的值的大小。

count

已分配向量中的元素数目。

示例

以下示例说明如何使用 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_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);
szClass

对象所属的类的名称。 如果通过 p_seclass 参数标识类,请将该参数设置为 NULL。

p_seclass

指向包含类说明的结构的指针。 如果通过 szClass 参数标识类,请将该参数设置为 NULL。

szObj

要提取其属性值的记录的名称。 如果通过 p_seobj 参数标识记录,请将该参数设置为 NULL。

p_seobj

指向包含对象说明的结构的指针。 如果通过 szObj 参数标识对象,请将该变量设置为 NULL。

szProp

要提取的属性的名称。 如果通过 p_seprop 参数标识属性,请将该变量设置为 NULL。

p_seprop

指向包含属性说明的结构的指针。 如果通过 sz_Prop 参数标识属性,请将该变量设置为 NULL。

val

指向内存中用于存储结果的位置的指针。

size

进入时,此值是参数 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_FreeListPropVal 函数

在使用 seadmapi_FetchListPropVal 函数提取列表值后必须使用 seadmapi_FreeListPropVal 函数来释放为值分配的内存。 为此函数提供的参数必须与为 seadmapi_FetchListPropVal 函数提供的参数一样。

任何进程都可以调用此函数。

没有返回值。

void seadmapi_FreeListPropVal(void ***list, unsigned int *count);    
list

指向 seadmapi_FetchListPropVal 函数分配的向量的指针。

count

指向已分配向量中的元素数目的指针。

更多信息:

seadmapi_FetchListPropVal 函数

seadmapi_SetSinglePropVal 函数

seadmapi_SetSinglePropVal 函数设置单值属性的值。‑ Watchdog 和代理使用此函数。 为防止破坏数据库,不允许其他进程使用此函数。

只有 Watchdog 和代理才能使用 seadmapi_SetSinglePropVal 函数。

如果函数成功,则返回 0;如果失败,则返回错误代码。

int seadmapi_SetSinglePropVal(const char *szClass,     
const char *szObj,     
const char *szProp,     
void       *val,     
int        size);
szClass

记录所属的类的名称。

szObj

要设置其属性的记录的名称。

szProp

要设置其值的属性的名称。

val

要分配给属性的值。

size

值的大小(以字节为单位)。

seadmapi_MakePDFList 函数

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);
szClass

类名。

ppPdf

指向 SEOSDB_PDF 指针(指向包含属性向量的已分配内存区域)的指针。

nCount

向量中的属性数。

seadmapi_Entity 函数

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);    
szCName

类名。

szOName

对象名称。

podf

指向要使用对象说明进行填充的内存区域的指针。

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;     
}

seadmapi_GetGraceInfo 函数

此函数检索有关用户密码、上次登录日期以及用户仍然具有的宽限登录次数的信息。

此函数可以由具有 ADMIN 属性的用户执行的进程进行调用。

所有用户均可以根据需要执行此函数。

int seadmapi_GetGraceInfo(SEGRACE_RES *p_sgr);    
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;
}

seadmapi_OidToName 函数

此函数提供将对象 ID 转换为包含对象名称的字符串的便捷方式。 如果数据库中不存在该对象(例如,对象已删除),则此函数返回的字符串为 NULL。

此函数返回的指针是指向静态区域的指针,该静态区域将被每个后续调用所覆盖。 因此,使用多线程时此函数不是很安全。‑

此函数可以由具有以下任意属性的用户执行的进程进行调用:

Watchdog 和代理也可以使用这些函数。

如果函数成功,则返回对象名称;如果失败,则返回 NULL。

char *seadmapi_OidToName(SEOS_OID oid);    
oid

记录的对象 ID。

更多信息:

seadmapi_ObjGet 函数

seadmapi_WhoAmI 函数

此函数向引擎提供当前进程的相关信息。 此函数返回的信息可用于从数据库或授权引擎提取其他信息。

对于此函数,您应当了解以下信息:

如果函数成功,则返回 0;如果失败,则返回错误代码。

int seadmapi_WhoAmI(uid_t *uid, int *handle, char *szUName, SEOS_UMODE *objtype);    
uid

与当前进程关联的 UID。 在 UNIX 中,这与使用 getlogin UNIX 函数效果一样,甚至更安全。

handle
与当前进程关联的 ACEE 句柄。 请参阅本部分中的“注意”。
szUName

与当前进程关联的用户名。

objtype

在数据库中保存的用户类型。 指定分配给用户的属性。

示例

以下示例说明如何使用 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 函数

seadmapi_WhoIs 函数提供有关指定用户的信息。 此函数从数据库中获取用户类型(属性)。 szUName 参数指向的内存区域必须足以容纳 255 个字符。

seadmapi.h 标头文件包含多个针对 objtype 变量数据运行的宏,用于确定用户是否具有特定属性。 这些宏具有 SEOS_UMODE_is_attribute 的常见表示法。 系统中的任何进程都可以调用此函数。

如果函数成功,则返回 0;如果失败,则返回错误代码。

int seadmapi_WhoIs(char *szUName, SEOS_UMODE *objtype);    
szUName

与当前进程关联的用户名。

objtype

在数据库中保存的用户类型。 指定分配给用户的属性。

seadmapi_ACEE 函数

给定一个句柄后,seadmapi_GetACEE 检索相关的 ACEE 信息。 此函数也能够在 CA ControlMinder 中扫描当前为用户分配的所有 ACEE。 信息将加载到由此函数自己分配的内存区域中。 在 CLIENT_ACEE 结构中填充的信息包含给定 ACEE 的所有凭据。

对于此函数,您应当了解以下信息:

如果函数成功,则返回 0;如果失败,则返回错误代码。

int seadmapi_GetACEE(int hAcee, CLIENT_ACEE **ppAcee);
void seadmapi_FreeAceeMemory(CLIENT_ACEE **ppAcee);
ppAcee

指向一个指针(已分配为指向 seadmapi_GetACEE 分配的存储区域)的指针。 函数 seadmapi_FreeAceeMemory 将接收此相同地址以释放分配的内存。

更多信息:

seadmapi_WhoAmI 函数

seadmapi_GetMessage 函数

此函数从消息文件检索错误描述,并将其放入 buff 参数指向的缓冲区中。

系统中的每个进程都可以使用此函数。

如果函数成功,则返回 0;如果失败,则返回错误代码。

int seadmapi_GetMessage(int err_code, int size, char *buff);
err_code

由一个 CA ControlMinder 函数返回的错误代码。

size

缓冲区的大小(以字节为单位)。 通常,2 KB 的缓冲区已足够。

buff

指向包含错误描述文本的缓冲区的指针。

更多信息:

seadmapi_FetchListPropVal 函数

seadmapi_FetchSinglePropVal 函数

seadmapi_GetObjType 函数

此函数检索在当前进程的 ACEE 中存储的对象类型。 此信息可以与多个宏一起使用,以确定当前进程是否属于具有某个可分配给用户的特殊属性(ADMIN、AUDITOR、PWMANAGER 等等)的用户。

seadmapi.h 标头文件包含多个针对此变量数据运行的宏,用于确定用户是否具有特定属性。 这些宏具有 SEOS_UMODE_is_attribute 的常见表示法。

如果函数成功,则返回 0;如果失败,则返回错误代码。

int seadmapi_GetObjType(SEOS_UMODE *objtype);    
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;     
}

更多信息:

seadmapi_WhoAmI 函数

seadmapi_init 函数

此函数初始化 CA ControlMinder 中的通信通道。

系统中的每个进程都可以使用此函数。 在 Windows 环境中不使用此函数。

您必须先调用 seadmapi_init 或 seadmapi_IsSeOSSyscallLoaded 函数,然后才能在 seadmapi 库中调用任何其他函数。 但是,如果同时使用这两个函数,则必须先使用 seadmapi_init,然后再使用 seadmapi_IsSeOSSyscallLoaded。

如果初始化成功,则此函数返回 0;如果失败,则返回错误代码。 它可以确认在计算机上加载的确切 CA ControlMinder 系统调用。

int seadmapi_init(void)

seadmapi_IsSeOSSyscallLoaded 函数

此函数检查是否加载了 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_FetchSinglePropVal 函数

seadmapi_SendAuditRecord 函数

seadmapi_SendAuditRecord 函数向审核日志发送任意类型的审核信息。 此 API 提供的其他函数可在内部使用此函数以向日志文件提交特定类型的审核日志记录。 建议您使用针对每种审核记录类型的特定函数,而不是使用此函数,虽然在某些情况下使用此函数可能比较容易。

对于此函数,您应当了解以下信息:

Watchdog 和代理也可以使用这些函数。

如果函数成功,则返回 0;如果失败,则返回错误代码。

int seadmapi_SendAuditRecord(int type, int result, void *data);
type

审核记录的类型。 有关有效值的列表,请参阅 selogtype.h 标头文件。

result

CA ControlMinder 支持的有效结果代码之一。 有关有效值,请参阅 selogtype.h 标头文件。

data

指向审核记录数据的指针。 该指针必须根据提交的记录类型指向有效的数据。

seadmapi_SendAudit 函数

这些函数向审核日志发送审核记录。 函数使用 seadmapi_SendAuditRecord 函数。 建议您使用这些函数,而不是直接调用 seadmapi_SendAuditRecord 函数。

以下是 seadmapi_SendAudit 函数:

int seadmapi_SendAdminAudit(SEOS_AUDITADMIN *rec, int result);

以管理记录格式向审核日志发送审核记录。

int seadmapi_SendCwsAudit(SEOS_AUDITCWS *rec, int result);

以服务连接记录格式向审核日志发送审核记录。

int seadmapi_SendGenrAudit(SEOS_AUDITGENR *rec, int result);

以常规资源记录格式向审核日志发送审核记录。

int seadmapi_SendInetAudit(SEOS_AUDITINWARN *rec, int result);

以 TCP/IP 记录格式向审核日志发送审核记录。

int seadmapi_SendLoginAudit(SEOS_AUDITLOGIN *rec, int result);

以登录事件记录格式向审核日志发送审核记录。

int seadmapi_SendShutdownAudit(SEOS_AUDITDOWN *rec, int result);

以关闭记录格式向审核日志发送审核记录。

int seadmapi_SendStartupAudit(SEOS_AUDITSTART *rec, int result);

以启动记录格式向审核日志发送审核记录。

int seadmapi_SendUserAudit(SEOS_AUDITUSER *rec, int result);

仅在 UNIX 上有效

以用户记录格式向审核日志发送审核记录。

int seadmapi_SendWatchdogAudit(SEOS_AUDITWDWARN *rec, int result);

以 Watchdog 记录格式向审核日志发送审核记录。

CA ControlMinder 针对审核信息使用压缩算法。 因此,在填入信息之前应使用 0 初始化该结构。 通过调用每个系统的标准 C 库所提供的 memset 函数,可以初始化该结构。

此函数可以由具有以下任意属性的用户执行的进程进行调用:

Watchdog 和代理也可以使用这些函数。

如果函数成功,则返回 0;如果失败,则返回错误代码。

rec

指向包含事件特定数据的结构的指针。‑

result

CA ControlMinder 支持的有效结果代码之一。 有关有效结果代码的列表,请参阅 selogtype.h 标头文件。

seadmapi_SendNotificationAudit 函数

这些函数向审核日志发送通知记录。 函数使用 seadmapi_SendAuditRecord 函数。 建议您使用这些函数,而不是直接调用 seadmapi_SendAuditRecord 函数。 针对具有需要通知事件的关联用户的资源(NOTIFY 属性),生成通知记录。

以下是 seadmapi_SendNotificationAudit 函数:

int seadmapi_SendNfAdminAudit(SEOS_AUDITADMIN *rec, int result);

以管理记录格式向审核日志发送通知记录。

int seadmapi_SendNfCwsAudit(SEOS_AUDITCWS *rec, int result);

以服务连接记录格式向审核日志发送通知记录。

int seadmapi_SendNfGenrAudit(SEOS_AUDITGENR *rec, int result);

以常规资源记录格式向审核日志发送通知记录。

int seadmapi_SendNfInetAudit(SEOS_AUDITINWARN *rec, int result);

以 TCP/IP 记录格式向审核日志发送通知记录。

int seadmapi_SendNfLoginAudit(SEOS_AUDITLOGIN *rec, int result);

以登录事件记录格式向审核日志发送通知记录。

int seadmapi_SendNfShutdownAudit(SEOS_AUDITDOWN *rec, int result);

以关闭记录格式向审核日志发送通知记录。

int seadmapi_SendNfStartupAudit(SEOS_AUDITSTART *rec, int result);

以启动记录格式向审核日志发送通知记录。

int seadmapi_SendNfUserAudit(SEOS_AUDITUSER *rec, int result);

仅在 UNIX 上有效

以用户记录格式向审核日志发送通知记录。

int seadmapi_SendNfWatchdogAudit(SEOS_AUDITWDWARN *rec, int result);

以 Watchdog 记录格式向审核日志发送通知记录。

CA ControlMinder 针对审核信息使用压缩算法。 因此,在填入信息之前应使用 0 初始化该结构。 通过调用每个系统的标准 C 库所提供的 memset 函数,可以初始化该结构。

此函数可以由具有以下任意属性的用户执行的进程进行调用:

Watchdog 和代理也可以使用这些函数。

如果函数成功,则返回 0;如果失败,则返回错误代码。

rec

指向包含事件特定数据的结构的指针。‑

result

CA ControlMinder 支持的有效结果代码之一。 有关有效结果代码的列表,请参阅 selogtype.h 标头文件。

seadmapi_SendErrorLog 函数

Watchdog 和代理使用此函数放置追溯信息,以记录可能的错误或故障。‑ 错误描述对于错误日志文件中的所有错误记录都通用。

如果函数成功,则返回 0;如果失败,则返回错误代码。

int seadmapi_SendErrorLog(SEOS_REQ_ERRORDESCP *rec);
rec

指向包含错误描述和追溯数据的结构的指针。‑

seadmapi_ProcessControl 函数

进程使用此函数控制其审核级别和安全。 任何进程都可以调用此函数,以便为所有操作打开审核功能或删除与进程关联的凭据。 使用 flags 参数时,进程可以控制这些值。 flags 参数可以包含下表中介绍的任何值或其按位 OR 值。‑

当前支持以下标志:

SEADMAPI_PROCCNTL_NOACEE

删除其 ACEE 并使用未定义到 CA ControlMinder 的用户凭据的进程请求。 新的 NULL 凭据分配给进程及任意子进程。

SEADMAPI_PROCCNTL_LOGALL

对进程及其子进程发出的每个请求进行审核的请求。

senone 实用程序使用此函数;系统中的每个进程都可以调用它。

如果函数成功,则返回 0;如果失败,则返回错误代码。

int seadmapi_ProcessControl(unsigned long flags);    
flags

一个或多个按位值。‑

seadmapi_consTrace 函数

这些函数控制跟踪日志记录。 跟踪函数用于帮助诊断问题以及帮助了解 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);
CurrStatus

调用后的跟踪的状态。

seadmapi_consUidLogin 函数

这些函数对用户并发登录设置执行操作。 函数执行以下操作:

用户通过 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);    
uid

函数执行操作的用户 ID。

CurrStatus

用户并发登录设置的当前状态。

seadmapi_consAllLogin 函数

这些函数控制用户登录系统的能力。 如果已禁用登录,则在 CA ControlMinder 运行时不允许任何用户登录系统。

这些函数与 secons ‑L 选项提供相同功能。

对于此函数,您应当了解以下信息:

如果函数成功,则返回 0;如果失败,则返回错误代码。

int seadmapi_consAllLoginDisable(void);
int seadmapi_consAllLoginEnable(void);
int seadmapi_consAllLoginGetStatus(int *CurrStatus);
CurrStatus

系统范围内的禁用登录标志的当前状态。‑

seadmapi_consRefreshIPAddresses

此函数刷新内核运行时表中主机名到 IP 地址的解析。

如果函数成功,则返回 0;如果失败,则返回错误代码。

注意:此函数只可以由具有 ADMIN 属性的用户进行调用。

int seadmapi_ReloadIni(unsigned int* puiNumberOfRefreshedResources);
puiNumberOfRefreshedResources

当函数成功完成时,将包含已刷新的资源数目。

seadmapi_consRunTimeStatisticsGet 函数

此函数检索 seosd 的运行时统计信息。 可以使用 secons 实用程序查看此信息。 该信息放置在 rtsStat 参数指向的结构中。 此结构包含以下信息:

inet_deny

拒绝的 TCP/IP 请求数目。

inet_grant

允许的 TCP/IP 请求数目。

inet_error

由于错误而无法解析的 TCP/IP 请求数目。

audit_log_q

队列中未写入的审核记录数。

error_log_q

队列中未写入的错误记录数。

oidLast

上次使用的对象 ID。

pidLast

上次使用的属性 ID。

cidLast

上次使用的类 ID。

classRecCount

数据库中的类数。

propRecCount

数据库中的属性数。

objRecCount

数据库中的对象(记录)数。

pvRecCount

属性值数据库中的记录数。‑

nAceeHandles

当前使用的 ACEE 条目数。

nClients

受保护的客户端数。 (此字段保留供将来使用。)

nTrusted

缓存中加载的受信任程序数。

nUntrusted

在缓存中标记为不受信任的程序数。‑

此函数与 secons 实用程序的 ‑i 选项提供相同信息。

对于此函数,您应当了解以下信息:

如果函数成功,则返回 0;如果失败,则返回错误代码。

int seadmapi_consRunTimeStatisticsGet(SEADMAPI_RTSTAT *rtsStat);    
rtsStat

包含运行时统计信息的结构,如描述中所述。‑

seadmapi_consMessageSend 函数

此函数将消息提交到 CA ControlMinder 跟踪。

此函数与 secons 实用程序的 ‑m 选项提供相同功能。

任何进程都可以调用此函数。

如果函数成功,则返回 0;如果失败,则返回错误代码。

int seadmapi_consMessageSend(const char *szMessage);    
szMessage

要放入跟踪日志中的消息的字符串。

seadmapi_consShutdown 函数

此函数导致 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);

seadmapi_ReloadIni 函数

此函数重新加载 seosd 后台进程的配置标记。 这些标记位于 seos.ini 文件中。 实际上,后台进程仅使用一部分新重新加载的标记。

此函数只可以由具有 ADMIN 或 OPERATOR 属性的用户进行调用。

如果函数成功,则返回 0;如果失败,则返回错误代码。

int seadmapi_ReloadIni(void);

sepass_ReplacePassword 函数

sepass_ReplacePassword 函数可使用新密码替换用户密码。

假定用户在本地定义,并且在 domainCode 参数中未提供 SEPASS_API_DOMAIN_PMD,sepass_ReplacePassword 将替换本地 UNIX 文件中的用户密码。

可以根据以下条件替换密码:

userName

包含要替换其密码的用户的名称、以 NULL 结尾的字符串。‑

oldPasswd

包含调用函数的指定用户或管理员的当前(旧)密码、以 NULL 结尾的字符串。‑

newPasswd

包含新(所需)密码、以 NULL 结尾的字符串。‑

szPmd

包含要在其上更改密码模型(如果有)的策略模型的名称、以 NULL 结尾的字符串。‑

szMsg

指向将在其中存储成功或失败消息的缓冲区的指针。

msgLen

消息缓冲区的大小。

domainCodes

这些值之一:

指示应当输出的详细说明的标志。

ignoreRules

此参数的值可以为以下三个值之一:

keep_grace

在更改密码后重置用户的宽限属性。

do_as_user

像指定用户更改密码一样更改密码,而不是作为管理更改。

onlySeOS

此参数的值可以为以下两个值之一:

1-只在 CA ControlMinder 环境中更改密码;

0-在 UNIX 和 CA ControlMinder 环境中更改密码。

ChangeGrace

将用户的登录宽限期设置为指定天数。

-1 => 使用默认值 (1)。

结构和数据类型:CA ControlMinder 数据库数据结构

在数据库中,每个属性都具有自己的数据类型。 在数据库中定义的某些数据类型很简单,如字符串或整数值;其他数据类型是带多个字段的结构。

以下部分将说明主要的数据结构和数据类型。

CA ControlMinder 在数据库中定义和保存的每个数据类型都具有使用以下命名约定定义的符号常量:

SEOSDB_PTYPE_Access_Control_data_type

例如,类型 SEOS_OID 具有符号常量 SEOSDB_PTYPE_OID。

PTYPE 的 C 数据类型
SEOSDB_PTYPE_STR

ASCII‑Z 字符串。 通过最大字符串长度确定的属性大小。

SEOSDB_PTYPE_OID

数据库中的对象 ID。

SEOSDB_PTYPE_TIME

日期和时间。 (格式为 time_t。)

SEOSDB_PTYPE_INT

整数,大小为 1、2 或 4 个字节。 属性大小决定实际类型。

SEOSDB_PTYPE_UINT

不带符号的整数,大小为 1、2 或 4 个字节。 属性大小决定实际类型。

SEOSDB_PTYPE_UMODE

用户模式,即用户是否为 ADMIN、AUDITOR 等。 此值作为位字段存储为整数。

SEOSDB_PTYPE_GCONN

用户与组的连接信息。

SEOSDB_PTYPE_ACCS

允许的访问类型。 访问权限是 32 位字段值。‑

SEOSDB_PTYPE_ACL

ACL 条目。

SEOSDB_PTYPE_PACL

程序条件 ACL 条目。

SEOSDB_PTYPE_UAUDITM

用户帐户的审核触发器。 这是一个位字段值。

SEOSDB_PTYPE_DAYTIME

针对资源访问权限的日期和时间限制。

SEOSDB_PTYPE_TRPINFO

文件特征的受信任程序信息。

SEOSDB_PTYPE_INETACL

HOST 或其他 Internet 类的 ACL 条目。

SEOSDB_PTYPE_RAUDITM

资源的审核触发器。 这是一个 16 位字段值。‑

SEOSDB_PTYPE_BOOL

表示布尔值的不带符号的字符。

SEOSDB_PTYPE_IPMSKMTCH

IP 地址的掩码和匹配值的组合。

SEOSDB_PTYPE_INSRACL

TCP/IP 服务范围 ACL 条目。

说明

在这些结构的每个数据成员中存储的信息和值列在 seostypes.h 文件中。 在某些情况下,结构只是单个值或同一类型的条目列表。 例如,ACL 是 0 个或多个 ACL 条目的列表。 用户所连接到的组的列表是 SEOS_GCONN 结构的列表。 后者还表示实体相互指向的情况。 用户对象具有所连接到的组的列表。 组具有所连接用户的列表。

注意:有关每一类中各个属性的完整说明,请参阅《selang 参考指南》。

以下列表简要介绍了管理 API 函数的数据库结构和数据类型:

CLIENT_ACEE

包含给定 ACEE 的信息

SEADMAPI_RTSTAT

包含运行时统计信息

SEGRACE_RES

包含宽限登录信息

SEOS_ACCS

包含访问标志的列表

SEOS_ACL

包含 ACL 的列表

SEOS_CID

包含类标识描述符

SEOS_GCONN

包含用户连接到的组的列表以及用户具有的与各个组相关的属性(如果有)

SEOS_OID

包含对象标识描述符

SEOS_PID

包含属性标识描述符

SEOS_X_ACL

包含 ACL 的列表,其中含有比 SEOS_ACL 更多的信息

SEOS_X_GCONN

类似于 SEOS_GCONN,但是包含更多信息

SEOS_X_OID

包含扩展的对象标识描述符

SEOS_X_PACL

包含扩展的 PACL 列表

SEOSDB_CDF

包含数据库中特定类的定义

SEOSDB_ENTDAT

包含有关数据库中属性的信息

SEOSDB_ODF

包含数据库中特定对象的定义

SEOSDB_PDF

包含数据库中特定属性的定义

日志文件结构

CA ControlMinder 使用二进制压缩文件来存储审核和错误日志记录。 日志文件由每个记录的固定部分和可变长度部分组成。‑ 固定部分包含一些常用数据(类似于记录提交时间)及可变长度部分的大小和类型。‑ CA ControlMinder 定义不同审核记录的若干结构。 当前版本的 CA ControlMinder 提供以下审核记录。

数据结构

以下结构可供管理 API 和 LogRoute API 使用。

SEOS_AUDITADMIN

CA ControlMinder 更新和语言解析器接口请求

SEOS_AUDITDOWN

CA ControlMinder 后台进程和服务关闭事件

SEOS_AUDITGENR

常规资源审核事件

SEOS_AUDITINWARN

CA ControlMinder TCP/IP 事件审核信息

SEOS_AUDITLOGIN

登录事件和密码事件审核记录

SEOS_AUDITSTART

CA ControlMinder 后台进程和服务启动事件

SEOS_AUDITUSER

已审核用户的跟踪记录

SEOS_AUDITWDWARN

用于将受信任程序标记为不受信任程序的 Watchdog 审核记录

SEOS_REQ_ERRORDESCP

CA ControlMinder 错误追溯信息‑

所有这些结构都在标头文件 selogtype.h 中定义。

CLIENT_ACEE 结构

CLIENT_ACEE 结构包含给定 ACEE 的信息。 相应字段如下:

long hAcee

ACEE 的句柄。

long nGroups

组连接的数目。

CLIENT_ACEE_GCONN *Groups

组连接数组。

long nCategories

类别数目。

char *pszCategories

类别名称数组。

char *szSecLabel

安全标签。

char *szUsername

用户名。

SEOS_UAUDIT_MODE AuditMode

用户的审核模式。

unsigned char SecLevel

用户的安全级别。

char *szTerminal

源终端。

int count

ACEE 的进程计数。

SEOS_UMODE user_mode

用户的模式。

time_t create_time

ACEE 的创建时间。

SEADMAPI_RTSTAT 结构

SEADMAPI_RTSTAT 结构包含从 seadmapi_consRunTimeStatisticsGet 函数检索到的信息。

相应字段如下:

unsigned int inet_deny

拒绝的 inet 请求数目。

unsigned int inet_grant

允许的 inet 请求数目。

unsigned int inet_errors

包含错误的 inet 请求数目。

long audit_log_q

审核日志队列大小。

long error_log_q

错误日志队列大小。

SEOS_OID oidLast

数据库中的第一个可用对象 ID。

SEOS_PID pidLast

数据库中的第一个可用属性 ID。

SEOS_CID cidLast

数据库中的第一个可用类 ID。

long classRecCount

数据库中的类数。

long propRecCount

数据库中的属性数。

long objRecCount

数据库中的对象数。

long pvRecCount

数据库中的属性值数。

long nAceeHandles

系统中当前的 ACEE 句柄数。

long nClients

受保护的客户端数。

long nTrusted

数据库中当前受信任的程序数。

long nUnTrusted

数据库中当前不受信任的程序数。

SEGRACE_RES 结构

SEGRACE_RES 结构包含由 seadmapi_GetGraceInfo 函数检索的信息。

相应字段如下:

int step

表示结构中所包含信息类型的整数。 值包括:

SEGRACE_STEP_NONE

没有可显示的数据。

SEGRACE_STEP_WARN

向用户显示警告,例如用户剩余的宽限天数或用户密码到期前的天数。

SEGRACE_STEP_MUST

用户的密码已到期;必须立即替换。

char msg[ ]

向用户显示的消息。

char last_log[ ]

包含有关用户上次登录信息的消息。

int grace

用户剩余的宽限登录次数。

int days

用户必须更换密码前的天数。

char uname[ ]

已为其完成查询的用户的名称。

SEOS_ACL 结构

SEOS_ACL 结构介绍访问者获得的访问权限。

相应字段如下:

SEOS_OID oidAccessor

访问者的对象 ID。

SEOS_ACCS Accs

用户对资源的访问级别。

更多信息:

SEOS_ACCS 结构

SEOS_GCONN 结构

SEOS_GCONN 结构包含用户连接到的组的列表,以及用户具有的与这些组相关的特殊属性(如果有)。

相应字段如下:

SEOS_OID oidGroup

组的对象 ID。

SEOS_OID oidAuthor

连接的所有者。

SEOS_TIME tConn

建立连接的日期和时间。

SEOS_UGMODE ugmUserMode

组中用户的属性。

SEOS_PACL 结构

SEOS_PACL 结构包含条件访问控制列表的列表。

相应字段如下:

SEOS_OID oidAccessor

访问者的对象 ID。

SEOS_OID oidProg

受信任程序的对象 ID。

SEOS_ACCS Accs

用户对资源的访问级别。

更多信息:

SEOS_ACCS 结构

SEOS_REQ_ERRORDESCP 结构

SEOS_REQ_ERRORDESCP 结构包含发送至审核日志的信息。

相应字段如下:

int module

发送错误记录的模块的编号。

int code

错误代码。

char name[ ]

发送错误记录的模块的名称。

char source[ ]

错误的源文件。

int stage

发现错误时所处的阶段。

int severity

错误的重要级别。

SEOS_X_ACL 结构

SEOS_X_ACL 结构是 SEOS_ACL 结构的扩展版本。

相应字段如下:

SEOS_OID oidAccessor

访问者的对象 ID。

SEOS_ACCS Accs

用户对资源的访问级别。

char *pAccessorCName

访问者所属的类。

char *pAccessorOName

访问者姓名。

更多信息:

SEOS_ACCS 结构

SEOS_X_GCONN 结构

SEOS_X_GCONN 结构是 SEOS_GCONN 结构的扩展版本。

相应字段如下:

SEOS_OID oidGroup

组的对象 ID。

SEOS_OID oidAuthor

连接的所有者。

SEOS_TIME tConn

建立连接的日期和时间。

SEOS_UGMODE ugmUserMode

组中用户的属性。

char *pGName

组名称。

char *pAuName

作者姓名。

SEOS_X_PACL 结构

SEOS_X_PACL 结构是 SEOS_PACL 结构的扩展版本。

相应字段如下:

SEOS_OID oidAccessor

访问者的对象 ID。

SEOS_OID oidProg

受信任程序的对象 ID。

SEOS_ACCS Accs

用户对资源的访问级别。

char *pAccessorCName

类名。

char *pAccessorOName

对象名称。

char *pProgName

允许通过其进行访问的程序名称。

更多信息:

SEOS_ACCS 结构

SEOSDB_CDF 结构

SEOSDB_CDF 结构包含数据库中特定类的定义。

相应字段如下:

SEOS_CID sCId

类的 ID。

char szCName[]

类的名称。

unsigned long lCFlags

类的标志。

unsigned char cCRLevel

保留供将来使用。

unsigned char cCWLevel

保留供将来使用。

char reserved[]

保留供将来使用。

SEOSDB_ENTDAT 结构

SEOSDB_ENTDAT 结构包含 seadmapi_GetEntity 和 seadmapi_GetExEntity 函数返回的信息。

相应字段如下:

char *szPName

属性名。

SEOS_CID sCId

对象类的类 ID。

SEOS_PID sPId

对象的属性 ID。

unsigned long int lPFlags

属性的标志。

unsigned short int sPVSize

属性大小。

unsigned char int cPType

保留供将来使用。

unsigned char cPRLevel

保留供将来使用。

unsigned char cPWLevel

保留供将来使用。

unsigned int nPVQty

pPVList 中的值数目。

void **pPVList

值列表。

unsigned int nErrorCode

在函数无法返回请求数据的情况下的错误代码。

SEOS_X_OID 结构

SEOS_X_OID 数据类型是 SEOS_OID 数据类型的扩展版本。

相应字段如下:

SEOS_OID oid

作为不带符号的长整数的记录的对象 ID。

char *pCName

对象的类。

char *pOName

对象的名称。