異構環境下,每個平台(IBM i、Linux、Windows)都有自有的用戶權限模型。DMTF(分布式管理任務組)發布的 CIM (Common Information Model) 及其上的 Management Profiles,提供了跨平台、廠商中立的管理抽象層。本文以 Role Based Authorization Profile 為例,示範如何將 IBM i 的角色權限體系映射至標準模型,並用 SBLIM 開發管理客戶端。
IBM i 定義 5 種角色、8 項特權,預設映射隨 QSECURITY 系統值(安全等級)變化:
| 角色 | QSECURITY 10/20 特權 | QSECURITY 30+ 特權 |
|---|---|---|
| USER | *ALLOBJ, *SAVSYS | (無預設) |
| SYSOPR | *ALLOBJ, *SAVSYS, *JOBCTL | *SAVSYS, *JOBCTL |
| PGMR | *ALLOBJ, *SAVSYS, *JOBCTL | *SAVSYS, *JOBCTL |
| SECADM | *ALLOBJ, *SAVSYS, *SECADM, *JOBCTL | *SECADM |
| SECOFR | *ALLOBJ, *AUDIT, *IOSYSCFG, *JOBCTL, *SAVSYS, *SECADM, *SERVICE, *SPLCTL | 同左(完整特權) |
業務痛點:若需給 USER 角色額外授予 *SECADM,原生機制僅支援「用戶級覆蓋」,無法建立新的通用角色。

核心類與關聯:
CreateRole()、AssignRole()、ShowAccess() 等方法SupportedMethods 屬性聲明實際支援哪些方法
創建擁有 {*ALLOBJ, *SAVSYS, *SECADM} 的新角色「USER_EXT」,指派給用戶 A。優點:復用性高;缺點:需平台支援動態創建角色,IBM i 受限於系統架構無法實現。

MemberOfCollection,專有角色用 ConcreteDependency兩種模式可共存:通用角色服務標準職務,專有角色處理例外授權。
import org.sblim.wbem.cim.*;
import org.sblim.wbem.client.*;
public class IBMiPrivilegeEnumerator {
public static void main(String[] args) throws Exception {
// 1. 建立 CIM 客戶端連線
UserPrincipal principal = new UserPrincipal("JINGLEI");
PasswordCredential cred = new PasswordCredential("password".toCharArray());
CIMNameSpace ns = new CIMNameSpace("https://CD06070C.CN.IBM.COM:5988", "root/cimv2");
CIMClient client = new CIMClient(ns, principal, cred, CIMClient.CIM_XML);
// 2. 列舉所有 Identity (用戶帳號)
CIMObjectPath identityPath = new CIMObjectPath("CIM_Identity", "root/cimv2");
Enumeration identities = client.enumerateInstanceNames(identityPath);
while (identities.hasMoreElements()) {
CIMObjectPath userPath = (CIMObjectPath) identities.nextElement();
String userName = userPath.getKey("Name").getValue().toString();
// 3. 遍歷 ConcreteDependency 找到專有角色
Enumeration rolePaths = client.associatorNames(userPath,
"CIM_ConcreteDependency", null, null, null);
while (rolePaths.hasMoreElements()) {
CIMObjectPath rolePath = (CIMObjectPath) rolePaths.nextElement();
// 4. 遍歷 MemberOfCollection 找到角色擁有的特權
Enumeration privPaths = client.associatorNames(rolePath,
"CIM_MemberOfCollection", null, null, null);
System.out.print("User: " + userName + " -> Privileges: ");
while (privPaths.hasMoreElements()) {
CIMObjectPath privPath = (CIMObjectPath) privPaths.nextElement();
String priv = privPath.getKey("InstanceID").getValue().toString();
System.out.print(priv + " ");
}
System.out.println();
}
}
client.close();
}
}
enumerateInstanceNames(CIM_Identity) → 獲取所有用戶節點associatorNames(..., CIM_ConcreteDependency) → 沿「專有角色」關聯邊走到 Role 節點associatorNames(..., CIM_MemberOfCollection) → 沿「角色-特權」關聯邊走到 Privilege 節點CIMObjectPath 的 Key InstanceID 取得特權字串(如 *SECADM)RoleBasedManagementCapabilities.SupportedMethods,避免調用不支援操作報錯。QSYRUSRI、QSYRUPRA 系統 API),Console 完全屏蔽差異。DMTF Profile 將「管理什麼」與「如何管理」分離。隨著 Software Inventory、Sensor、Virtualization 等數十個 Profile 成熟,單一管理控制台統管異構數據中心正從願景走向現實。對系統集成商與工具開發商而言,投資 Profile 相容實現,即是投資未來的互操作性紅利。