使用SQL更改MS-Access中的* .mdw权限?

时间:2014-03-27 19:16:58

标签: sql ms-access permissions

是否可以查询和/或更改存储在Microsoft Access *.mdw安全文件中的权限?

我真的厌倦了使用UI列出每个用户的权限并将它们全部写下来看看它们是什么......我查看了MSys*表的标题和我不要在那里看到任何看起来像用户或权限表的内容(至少在我与文件连接的数据库中......我的猜测就是它在* .mdw文件,但我无法通过我连接的数据库访问它。我有管理员权限,所以不是。

1 个答案:

答案 0 :(得分:2)

您当然可以编写代码来更改用户权限。

您可以100%选择将用户权限限制为安全组中的成员身份。如果你遵循这个规则,那么用户的权限永远不会存储在数据库中,而只能存储在工作组文件中。这使管理非常容易。 (希望这是在你的情况下完成的)。

您当然可以选择不遵循上述规则,结果现在用户权限将存在于工作组文件和数据库文件中。这当然会造成一个真正的混乱,因为那时你无法在异地系统的副本上进行开发。然后安全管理成为一个真正的动物园。

我建议使用这样的UI来选择用户: enter image description here

然后,下一个屏幕用于编辑/将该用户分配给安全组。 enter image description here

结果是一个非常简单的UI。因此,为了向用户授予诸如允许返回日期发票等的权限,现在只需单击鼠标即可“选择”给定的组。因此,该咔嗒声为用户提供了该安全组中的“成员资格”。

将用户添加到安全组的代码如下:

Public Function AddToSecGroup(strUserName As String, strGroupName As String)

 ' adds a user to a group
 Dim uUser      As user
 Dim ws         As Workspace

 Set ws = DBEngine.Workspaces(0)

 Set uUser = ws.Groups(strGroupName).CreateUser(strUserName)
 ws.Groups(strGroupName).Users.Append uUser
 ws.Groups(strGroupName).Users.Refresh
 ws.Groups.Refresh
 ws.Users.Refresh


End Function

从安全组中删除用户的代码如下:

  Public Sub RemoveFromSecGroup(strUserName As String, strGroupName As String)

     ' remove user from a group
     Dim uUser      As user
     Dim gGroup     As Group

     Set uUser = DBEngine.Workspaces(0).Users(strUserName)

     uUser.Groups.Delete strGroupName
     uUser.Groups.Refresh


  End Sub

更改用户密码的代码是:

 Function ChangePassword(ByVal strUser As String, _
                          ByVal strPwd As String) As Integer

     Dim ws As Workspace
     Dim usr As user

     Set ws = DBEngine.Workspaces(0)
     Set usr = ws.Users(strUser)
     usr.NewPassword "", strPwd

 End Function

对于团体会员资格,我使用此:

  Public Function IsInGroup(UsrName As String, GrpName As String) As Boolean
  'Determines whether UsrName is a member of GrpName

      Dim grp As Group
      Dim IIG As Boolean
      Dim usr As user

      IIG = False

      For Each usr In DBEngine.Workspaces(0).Users
          If usr.Name = UsrName Then GoTo FoundUser
      Next

      GoTo IIG_Exit

 FoundUser:
      For Each grp In usr.Groups
          If grp.Name = GrpName Then IIG = True
      Next

 IIG_Exit:
      IsInGroup = IIG


  End Function

因此,我建议您按安全组组织这些应用程序。结果是,一个简单的操作就是让销售团队人员使用一些新功能来代替25个销售人员逐个某种形式。通过消除这种“重复”过程,您不需要批量更新用户安全性,而只需将用户分配给安全组。

使用某些逻辑安全组通常可以消除更新“许多”用户的大部分需求,因为您现在只需将一件事添加到“许多”用户具有成员资格的给定安全组中。这个“建议”适用于管理桌面或Oracle的Windows域系统,或者在这种情况下适用于像Access这样的简单桌面系统。