施耐德Q6108如何获得当前登录用户所属的角色
适用于:
CitectSCADA 7.10,7.20
概述:
如何获得当前登录用户所属的角色呢?
解决方法:
Citect7.10中用户隶属于角色,这些角色共同来定义用户访问的区域和权限。当前活动
角色的列表在运行时并不能获得,但是可以通过调用DevOpen()和DevFind()函数来查找
users.dbf来获得当前的角色。
如果用户使用Windows集成帐户,那么Windows的组会链接到Citect中的角色。这时
就不能通过查找users.dbf来查找当前角色了,因为当前用户并不在Citect中定义。一个变
通的方法是在角色的“进入命令”中查找当前活动角色。
施耐德Q6108如何获得当前登录用户所属的角色将下列Cicode添加到您的工程中。然后打开工程管理器。按下F2键查看详细内容。将
每一个角色的“进入命令”设置为RoleSet("<角色名称>")来保存角色名称,将“退出命令”
设置为 RoleSet(""),使其在退出时清空。
INT mnMaxRoles = 16;
STRING msCurrentRoles[16];
STRING msCurrentUser = "";
INT mnCurrentRole = 0;
//Add the specified role to the current user's roles list. This is called by the Role's Entry
Command.
//Call RoleSet("") from the Role's Exit command to clear the list of roles.
FUNCTION
RoleSet(STRING sRole = "")
STRING sUserName = Name();
EnterCriticalSection("RoleSet");
IF StrLength(sRole) > 0 THEN
IF msCurrentUser <> sUserName THEN
msCurrentUser = sUserName;
mnCurrentRole = 0;
END
IF mnCurrentRole < mnMaxRoles THEN
msCurrentRoles[mnCurrentRole] = sRole;
ErrLog("RoleSet('" + sRole + "') added role " + mnCurrentRole:#);
mnCurrentRole = mnCurrentRole + 1;
ELSE
ErrLog("RoleSet() Too many roles to store");
END
ELSE
ErrLog("RoleSet() clearing roles");
mnCurrentRole = 0;
msCurrentUser = "";
END
LeaveCriticalSection("RoleSet");
END
//Check if the current user has the specified role
//
//Returns TRUE if the user has the role or the role was blank, otherwise FALSE.
//
INT
FUNCTION
UserHasRole(STRING sRole)
INT nRole = 0;
STRING sUser = Name();
//If no role was specified, allow access
IF StrLength(sRole) = 0 THEN
RETURN TRUE;
END
FOR nRole = 0 TO mnMaxRoles - 1 DO
IF msCurrentRoles[nRole] = sRole THEN
RETURN TRUE;
END
END
RETURN FALSE;
END
例如:
“角色名称”:Admin
“Windows组名”:Administrators
“全局权限”:1...8
“进入命令”:RoleSet("Admin")
“退出命令”:RoleSet("")
那么活动的角色列表将会被保存在msCurrentRoles[]数组中。检查当前用户是否属于某
一个角色,请使用Cicode:UserHasRole(sRole)。
例如:UserHasRole("Admin")
信息来源:施耐德官方网站。
本文地址:http://www.btone-mro.com/BtoneInform/newsContent.aspx?id=1058