在 SAP 和 LDAP 数据库中搜索用户或在 SAP 中创建用户
使用 C# 中的 Bapi。
引言
SAP 系统通常安装在大型企业办公室。有时我们可能会出错,导致一个用户拥有两个或多个登录名。当数据库很大时,我们如何找到这些重复项?如果您使用 CUA,并且 CUA 未与 LDAP 集成,那么此程序适合您。我创建此程序是为了帮助我完成工作。
首次发布在此处的版本只能搜索、创建用户、分配一个角色。现在我添加了用户角色的操作。
使用代码
在安装此程序之前,需要满足一些先决条件。
- 需要安装 .NET 3.0,通常在 PCs 上已经安装,从 WinXP 开始。
- 需要安装 SAPGUI7.xx(这是 SAP 的表示服务,用于 SAP 的后端系统)。
在程序中,使用以下 BAPI 函数:
- "
BAPI_USER_GETLIST
" - "
BAPI_USER_GET_DETAIL
" - "
BAPI_USER_CREATE1
" - "
BAPI_USER_CHANGE
" - "
BAPI_USER_UNLOCK
" - "
BAPI_USER_LOCK
" - "
RFC_READ_TABLE
"
BAPI 函数的导入/导出参数可以通过 SAP 中的 BAPI 事务或探索函数模块来获得。在 sapgui 中输入 SE37 -> 输入函数模块名称。下面是如何锁定用户的示例。
// input: user Login
public bool sapLockUser(string sUserLogin)
{
bool bOk = true;
if (sUserLogin == "") return false;
SAPFunctionsOCX.Parameter pUserName =
(SAPFunctionsOCX.Parameter)m_iBAPI_USER_LOCK.get_Exports("USERNAME");
((SAPFunctionsOCX.Parameter)pUserName).Value = sUserLogin;
bOk = m_iBAPI_USER_LOCK.Call();
if (bOk)
{
SAPTableFactoryCtrl.Tables tTables =
(SAPTableFactoryCtrl.Tables)m_iBAPI_USER_LOCK.Tables;
showReturn(ref tTables);
}
return bOk;
}
如果您在数据库中进行搜索,则需要为搜索创建一个范围区域。在 LDAP 中,我们使用构造 逆波兰表示法(从右到左)。您可以在搜索语句中添加自己的构造。
(&(cn=?)(objectCategory=person)(mail=*)(userAccountControl=512))
在 SAP 的函数模块中,我们使用另一种技术,需要填写 SELECTION_EXP
结构。您可以在 BAPI 事务的帮助文档中找到如何填写它,或者在 SAP 的文档中找到:SAP Identity Management APIs。
如果函数模块中的 import
参数是表,如 SELECTION_EXP
的情况,则需要使用包装函数,因为 C# 互操作和 SAP 的 COM 对象存在封送错误。正如您在 Lim Bio Liong 的博客中看到的那样,有许多方法可以解决此问题。这里使用了包装函数。
SAPTableFactoryCtrl.Table oSELECTION_EXP =
(SAPTableFactoryCtrl.Table)tTables["SELECTION_EXP"];
int icntCol = oSELECTION_EXP.ColumnCount;
int icntRow = oSELECTION_EXP.RowCount;
icntRow = oSELECTION_EXP.RowCount;
sSapLogin = null;
try
{
oRowSetVal oRowSet = new oRowSetVal();
object oRow = ((SAPTableFactoryCtrl.Rows)oSELECTION_EXP.Rows).Add(null);
oRowSet.SetVal(ref oRow, "LOGOP", "AND");
oRowSet.SetVal(ref oRow, "ARITY", "1");
oRow = ((SAPTableFactoryCtrl.Rows)oSELECTION_EXP.Rows).Add(null);
oRowSet.SetVal(ref oRow, "PARAMETER", "USERNAME");
oRowSet.SetVal(ref oRow, "OPTION", "CP");
oRowSet.SetVal(ref oRow, "LOW", sapTemplateLogin.ToUpper());
}
在包装 DLL 中,我添加了一个新函数:SetDateTime
。
现在 idl 描述如下:
interface IoRowSetVal : IDispatch{
[id(1), helpstring("method SetVal")]
HRESULT SetVal([in,out] VARIANT* pvRow, [in] BSTR vsColumn, [in] BSTR vsValue);
[id(2), helpstring("method SetDateTime")]
HRESULT SetDateTime([in,out] VARIANT* pvRow, [in] BSTR vsColumn, [in] VARIANT vVal);
};
程序中的数据结构
首先,我必须说,程序的大部分功能由数据结构决定。此程序中的数据结构如下所示:
围绕此结构创建了用户界面,以解决日常任务。
从用户角度看它是如何工作的
首先,您需要在此处填写配置选项卡中的初始参数。
第一次运行时,此选项卡是隐藏的。要显示它,您需要使用系统菜单取消隐藏。
填写配置选项卡后,您可以从界面选项卡中使用程序。
搜索词可以在“姓 名”或“SAP 用户登录名”字段中输入。如果找到了 SAP 中的登录名,它们可以显示在临时列表框中。如果选中了“带角色”复选框,则会加载用户分配的所有角色。登录名可以保存在内存列表框中,因为临时列表框在每次搜索过程中都会清除。按“Enter”开始搜索:这与按“搜索”按钮相同。要搜索公司,您可以在公司组合框中键入部分公司名称,然后按键盘上的“Enter”。
我必须说明,所有用户和角色的操作都在内存中进行,只有两个按钮会更改 SAP 中的用户内容:界面选项卡上的黄色“更改/创建”按钮和“角色”选项卡上的黄色“在 CUA 中保存用户”按钮,以及“已阻止”复选框可以更改用户登录名的状态:已阻止/未阻止!
找到登录名后,您可以切换到“角色”选项卡以查看角色或比较用户角色。
在此处可以删除、添加或更改角色(仅在按下“在 CUA 中保存用户”按钮时才保存到 SAP!)。
有时我需要比较不同用户的角色。
如果用户之间复制了角色,您可以将选定的用户保存为一组新角色。
我希望有人觉得这个实用程序很有用。
历史
- 20.11.2011:首次发布版本。
- 04.05.2012:发布 1.1.8 版本。
- 17.05.2012:1.1.10 版本(小改动)。
- 24.05.2012:1.1.11(在比较用户角色选项卡中进行小修正)。
- 07.09.2012:1.1.12(修正:角色大写,LDAP 过滤器未保存,一次点击比较两个登录名)。
- 15.05.2013:1.1.13(为 x64 机器在编译中添加 x86 目标,更改 LDAP<->SAP 电话和移动电话的映射)。