tvn_hut > 23-10-17, 11:08 AM
ongke0711 > 23-10-17, 11:21 AM
tvn_hut > 23-10-17, 01:11 PM
ongke0711 > 24-10-17, 10:15 PM
(23-10-17, 01:11 PM)tvn_hut Đã viết: Cám ơn bạn nhé. bạn có code không có thể share cho anh em tham khảo được ko? tại khi đọc trên web thì họ sư dụng hàm rất phức tạp.
Option Explicit
Public Declare Function GetUserName Lib "advapi32.dll" Alias "GetUserNameA" (ByVal lpBuffer As String, nSize As Long) As Long
Public Function UserName() As String
On Error GoTo EH
Dim lngLen As Long
Dim strTemp As String * 256
Dim strUserName As String
lngLen = 256
GetUserName strTemp, lngLen
strUserName = Trim$(Left$(strTemp, lngLen - 1))
UserName = strUserName
Exit Function
EH:
MsgBox "There was an error getting the User Name! " & _
"Please contact your Database Administrator.", vbOKOnly, "WARNING!"
Exit Function
End Function
tvn_hut > 30-10-17, 11:36 PM
(24-10-17, 10:15 PM)ongke0711 Đã viết:(23-10-17, 01:11 PM)tvn_hut Đã viết: Cám ơn bạn nhé. bạn có code không có thể share cho anh em tham khảo được ko? tại khi đọc trên web thì họ sư dụng hàm rất phức tạp.
Code demo lấy User đăng nhập của windows thì không khó nhưng theo tôi thì ý tưởng lấy Users của Windows (hoặc NetworkID) để đăng nhập ứng dụng Access không được an toàn và linh hoạt vì các lý do sau:
- Máy tính người nào thì người đó xài, không thể mượn máy để đăng nhập ứng dụng Access khi máy tính mình bị sự cố gì đó.
- Ứng dụng của bạn phụ thuộc hoàn toàn vào Username/pass của Windows. Nếu tài khoản Windows này bị h@ck thì ứng dụng của bạn cũng mất an toàn.
- Nếu ai đó nhảy vào sử dụng máy tính của User có quyền cao nhất trong ứng dụng của bạn (khi User đó di đâu đó mà chưa lock máy), họ táy máy hoặc có ý đồ xấu thì cũng toi ứng dụng của bạn.
- Phụ thuộc vào việc đặt tên UserName của nhân viên IT quản lý mạnh máy tính.
Nếu dùng Username tự tạo riêng của ứng dụng thì User đó có thể dùng bất kỳ máy tính nào để đăng nhập ứng dụng với quyền của mình. Admin của ứng dùng có toàn quyền, không phụ thuộc IT bên mạng máy tính.
Trước mắt thì tôi thấy có mấy ý như vậy.
Dưới đây là hàm lấy Username của Windows bằng hàm API, thay thế cái hàm Environ() vì hàm này không bảo mật cao, dễ bị h@ck. Người ta có thể can thiệp vào Username trả về của hàm Environ () bằng lệnh trong CMD
Mã PHP:Option Explicit
Public Declare Function GetUserName Lib "advapi32.dll" Alias "GetUserNameA" (ByVal lpBuffer As String, nSize As Long) As Long
Public Function UserName() As String
On Error GoTo EH
Dim lngLen As Long
Dim strTemp As String * 256
Dim strUserName As String
lngLen = 256
GetUserName strTemp, lngLen
strUserName = Trim$(Left$(strTemp, lngLen - 1))
UserName = strUserName
Exit Function
EH:
MsgBox "There was an error getting the User Name! " & _
"Please contact your Database Administrator.", vbOKOnly, "WARNING!"
Exit Function
End Function
Bạn muốn sử dụng hàm này cũng đơn giản. Ở cái form Main mà bạn Open khi khởi động ứng dụng, tạo 1 textbox để lưu Username (txtUserName), 1 texbox lưu QUyền (txtQuyen). Ở sự kiện On Open dùng code sau:
Me.txtUserName = UserName
Me.txtQUyen = DLookup (“Quyen”,”tblUsers”,”UserName = ‘” & Me.txtUserName & “’”)
Tôi dùng textbox lưu UserName và Quyền thay vì dùng biến toàn cục vì biến toàn cục không thể tin tưởng hoàn toàn, nó có thể không bị mất vì lý do nào đó của hệ thống. Nếu là Textbox nằm trên Form thì nó lúc nào cũng nằm đó, bạn có thể cho "Ẩn" form đi và chỉ đóng khi đóng ứng dụng.
ongke0711 > 01-11-17, 01:47 PM
(30-10-17, 11:36 PM)tvn_hut Đã viết: ...
Mình đã làm theo hướng dẫn của bạn nhưng nó vẫn báo lỗi: run time eror "91" - Object variable or with block variable not set. và nó chỉ tới dòng : gobjRibbon.InvalidateControl "tab1". Việc sử dụng phân quyền mình có tham khảo của MTNQ - phải nói là rất đơn giản nhưng rất hay. mình có thể áp dụng khi xây dựng form login nhưng khi sử dụng windown account thì lại báo lỗi như vậy. Bài toán của mình là xây dựng 3 tab, trong mỗi tab có 2 đến 3 nhóm lệnh. Chỉ cần làm được như vậy là có thể giải quyết xong vấn đề.
Đây là file demo của mình, mong các bạn chỉ dẫn giúp nó đang chạy sai chỗ nào.
https://drive.google.com/open?id=0Bwa-4B...TZNU196OTg
Public Sub UpdateRibbon()
If (Not gobjRibbon Is Nothing) Then
gobjRibbon.InvalidateControl "tab1"
gobjRibbon.InvalidateControl "tab2"
gobjRibbon.InvalidateControl "tab3"
gobjRibbon.InvalidateControl "grp1_1"
gobjRibbon.InvalidateControl "grp1_2"
gobjRibbon.InvalidateControl "grp2_1"
gobjRibbon.InvalidateControl "grp2_2"
gobjRibbon.InvalidateControl "grp2_3"
End If
End Sub