Đánh giá chủ đề:
  • 1 Votes - 5 Average
  • 1
  • 2
  • 3
  • 4
  • 5
[Help] Làm sao để biết những máy tính nào trong LAN đang mở file chương trình
#11
Chào bạn Mặt Trời Ngủ Quên, mình đã làm theo những gì bạn hướng dẫn và đã thành công, nhưng khi mình chuyển front end và backend sang sử dụng workgroup. Thì khi mình ấn demo 1 thì nó báo
---------------------------
Error: ReturnUserRoster
---------------------------
Error: -2147467259
You do not have the necessary permissions to use the 'Z:\database.mdb' object. Have your system administrator or the person who created this object establish the appropriate permissions for you.

2 file fontend và backend của mình chung workgroup và hoạt động bình thường, link vẫn tốt. Thế nhưng nó vẫn báo không có quyền khi call returnUserRoster.

Vậy không biết là có cách giải quyết nào hay ko, mong bạn hướng dẫn mình.
Chữ ký của mrsiro Xin chào, mình là mrsiro, Tham gia http://thuthuataccess.com/forum từ ngày 05-12 -14.
Reply
Những người đã cảm ơn
#12
Chào bạn mrsiro!
File Demo trên mình viết cho trường hợp không phân quyền trên CSDL (back end ). Nếu bạn phân quyền trên back end thì khi thiết lập kết nối phải có UserID và Password

Mã:
cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & strPathLinkTable _
        & "; Jet OLEDB:System Database=" & strMdwPath, "UserID", "Password"

Trong code trên thì :
- strPathLinkTable là đường dẫn đến CSDL
- strMdwPath là đường dẫn đến file Security.mdw của CSDL đó
-UserID : Tên của user có quyền truy cập, tạo mới cũng như update CSDL
- Password : cái này thì chắc không cần giải thích 005

Bạn tạo mới một form, trên form tạo một text box có tên txtTongSo, một list box có tên lstUsers.
Tại sự kiện Onload của form (hay code cho nút nhấn) bạn code như sau:

Mã:
Call ShowUserRosterMultipleUsers(Me)

Hai thủ tục sau chép vào một module bất kỳ:

Mã:
Public Sub ShowUserRosterMultipleUsers(mfrm As Form)
    On Error GoTo ErrorHandler
    Dim cnn As New ADODB.Connection
    Dim rst As New ADODB.Recordset
    Dim fld As ADODB.Field
    Dim strUser, strPathLinkTable, strMdwPath As String
    Dim intUser As Integer
    Dim varValue As Variant
    Const conUsers = "{947bb102-5d43-11d1-bdbf-00c04fb92675}"

    strPathLinkTable = GetCurrentPath("tblUser")
    strMdwPath = Left(strPathLinkTable, InStrRev(strPathLinkTable, "\")) & "Security.mdw"
    
    cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & strPathLinkTable _
        & "; Jet OLEDB:System Database=" & strMdwPath, "UserID", "Password"
    Set rst = cnn.OpenSchema(Schema:=adSchemaProviderSpecific, SchemaID:=conUsers)

    strUser = "COMPUTER_NAME;LOGIN_NAME;CONNECTED;SUSPECT_STAT"

    With rst
        Do Until .EOF
            intUser = intUser + 1
            For Each fld In .Fields
                varValue = Nz(fld.Value, "Null")
                If InStr(varValue, vbNullChar) > 0 Then
                    varValue = Left(varValue, InStr(varValue, vbNullChar) - 1)
                End If
                strUser = strUser & ";" & varValue
            Next
        .MoveNext
    Loop
    End With
    mfrm!txtTongSo = intUser
    With mfrm!lstUsers
        .ColumnCount = 4
        .RowSourceType = "Value List"
        .ColumnHeads = True
        .RowSource = strUser
    End With
    
    Set fld = Nothing
    Set rst = Nothing
    Set cnn = Nothing

Exit_ErrorHandler:
  Exit Sub

ErrorHandler:
    If Not fld Is Nothing Then Set fld = Nothing
    If Not rst Is Nothing Then Set rst = Nothing
    If Not cnn Is Nothing Then Set cnn = Nothing
    MsgBox "Error: " & Err.Number & Chr(13) & Err.Description, , "Error: ShowUserRosterMultipleUsers"
    Resume Exit_ErrorHandler

End Sub

Mã:
Function GetCurrentPath(MyLinkedTable As String) As String
    On Error GoTo ErrorHandler
    GetCurrentPath = Mid(CurrentDb.TableDefs(MyLinkedTable).Connect, InStr(1, CurrentDb.TableDefs(MyLinkedTable).Connect, "=") + 1)

Exit_ErrorHandler:
  Exit Function

ErrorHandler:
  MsgBox "Error: " & Err.Number & Chr(13) & Err.Description, , "Error: GetCurrentPath"
  Resume Exit_ErrorHandler
End Function

Trong thủ tục ShowUserRosterMultipleUsers :
-tblUser là table bất kỳ mà bạn link tới CSDL (back end )
-Security.mdw là file bảo mật của CSDL được tạo ra khi phân quyền và nằm chung thư mục với CSDL. Trên máy bạn có thể có tên khác (đuôi .mdw ) và có thể ở thư mục khác, bạn chỉnh lại cho đúng nha
-UserID Tên đăng nhập của user
-Password là mật khẩu của user

Chúc vui!
Chữ ký của MatTroiNguQuen Thời gian nước chảy... da mòn
Ngủ quên một chốc thấy còn bộ xương!
Reply
Những người đã cảm ơn mrsiro
#13
Mình không rành lắm về lập trình, bạn có thể cho mình 1 file demo thì tôt quá.
Chữ ký của mrsiro Xin chào, mình là mrsiro, Tham gia http://thuthuataccess.com/forum từ ngày 05-12 -14.
Reply
Những người đã cảm ơn
#14
Mình cố gắng mô tả cách làm khá chi tiết rùi.
Bạn copy 4 file: back_end, front_end, và hai file .mdw ra một thư mục khác, xóa trống tất cả dữ liệu ở hai file back_end, front_end. Lảm các bước như mình chia sẻ ở bài trên, nén thư mục đó lại và đưa lên đây.
(hoặc gởi qua mail: mattroinguquensgvn@gmail.com hay mattroinguquen@yahoo.com )
Nhớ cho tên đăng nhập và mật khẩu của user có quyền admin nhé, mình sẽ sửa code giúp
Chữ ký của MatTroiNguQuen Thời gian nước chảy... da mòn
Ngủ quên một chốc thấy còn bộ xương!
Reply
Những người đã cảm ơn
#15
Xin lỗi các bạn! ở bài #12 mình có sự nhầm lẫn về UserID, mình xin đính chính lại như sau:
[User ID] trong chuỗi kết nối đến CSDL không phải là UserID của user trong WorkGroup mà là tên đăng nhập của User (mình đã sửa lại)

Dưới đây là file Demo cho câu hỏi của bạn mrsiro:
-Tải về giải nén vào ổ D (thư mục gốc)

Mình tạo sẵn 5 users:, tất cả đều có password là 123456
- user có quyền quản trị là: mtnq
-User chỉ có quyền xem dữ liệu là: user3

1/Với máy cài AC2010
-Bấm AutoLoginApp_2010.mdb để tự động đăng nhập với tài khoản mtnq
-Bấm RunApp_2010.mdb để mở cửa sổ đăng nhập
2/Với máy cài AC2003
Tương tự như trên với AutoLoginApp_2003.mdb và RunApp_2003.mdb

-File ví dụ mình đã lược bớt cho đỡ rối (chỉ còn lại Demo3) , dùng Unbound form và ADO

Xem ai dang truy cap CSDL2

-File còn cả 3 Demo:

Xem ai dang truy cap CSDL

Có một số câu hỏi xung quanh chủ đề này nhưng bây giờ mình bận rùi, hẹn gặp lại trong bài viết sau vậy 015
Chữ ký của MatTroiNguQuen Thời gian nước chảy... da mòn
Ngủ quên một chốc thấy còn bộ xương!
Reply
Những người đã cảm ơn mrsiro
#16
(24-02-14, 01:21 AM)MatTroiNguQuen Đã viết: Chào bạn connguoi123! mình giải thích cách làm cụ thể như sau:

-Khi người dùng đăng nhập thành công, ta cập nhật tên máy, thời gian đăng nhập và UserOnline = True
- Khi người dùng đăng xuất hay tắt ứng dụng ta set Useronline = False (bằng cách chạy query qrUpdatetblUser)

Như vậy bạn chỉ cần lọc ra danh sách (ds) các Users có Useronline = True (Mình tạm gọi là ds 1) là biết được ai đang chạy ứng dụng cũng như tên máy và thời gian đăng nhập

Tuy nhiên trên đây là điều kiện cần nhưng chưa đủ.
Có một số trường hợp Useronline vẫn là True mặc dù người dùng đã thoát do ứng dụng được tắt không đúng cách (qrUpdatetblUser không được gọi khi thoát ứng dụng)


Ta dùng thủ tục ReturnUserRoster để lấy về tên các máy tính đang kết nối đến CSDL (ds 2)
Sau đó ta duyệt qua từng mẫu tin trong ds1 xem ComputerName có nằm trong ds2 hay không, nếu có thì set CpuOnline = True
Cuối cùng lọc ra danh sách thỏa 2 điều kiện UserOnline = True và CpuOnline = True ta có ds người dùng hiện đang truy cập CSDL

Giải thích các lệnh trong thủ tục ReturnUserRoster:
Mã PHP:
Public Function ReturnUserRoster(mfrm As Form)
    
On Error GoTo ErrorHandler
    Dim strPathLinkTable 
As String
    Dim cnn 
As New ADODB.Connection
    Dim rst 
As ADODB.Recordset
    Dim rstUserOnl 
As New ADODB.Recordset
    Dim SQL 
As String
    
'Lệnh sau đây set CpuOnline = 0 cho tất cả các mẫu tin trong bảng tblUser
    CurrentDb.Execute "UPDATE tblUser SET tblUser.CpuOnline = 0 "
'
Lấy về đường dẫn đến CSDL (back end):
    
strPathLinkTable GetCurrentPath("tblUser")
'Thiết lập Kết nối đến CSDL: 
    cnn.Open "Provider= Microsoft.Jet.OLEDB.4.0; data source=" & strPathLinkTable
'
Lấy về bản ghi chứa tên các máy đang truy cập đấn CSDL(ds2):
    
Set rst cnn.OpenSchema(adSchemaProviderSpecific _
        
, , "{947bb102-5d43-11d1-bdbf-00c04fb92675}")
 
'Lấy về danh sách các mẫu tin có UserOnline = -1 (-1 = True): ds1  
    SQL = "SELECT Computername,CpuOnline FROM tblUser WHERE tblUser.UserOnline = -1 "
    rstUserOnl.Open SQL, cnn, adOpenStatic, adLockOptimistic
 '
Với mỗi tên máy trong ds2-rst(0), ta duyệt qua ds1-rstUserOnl(0nếu thấy trùng tên máy thì set cpuOnline = -
    
Do While Not rst.EOF
        
If Not rstUserOnl.BOF Then rstUserOnl.MoveFirst
        
Do While Not rstUserOnl.EOF
            
If Trim(rstUserOnl(0)) = Trim(rst(0)) Then
                rstUserOnl
!CpuOnline = -1
                rstUserOnl
.Update
            End 
If
            
rstUserOnl.MoveNext
        Loop
        rst
.MoveNext
    Loop
    Set rstUserOnl 
Nothing
    Set rst 
Nothing
    Set cnn 
Nothing
    
Exit_ErrorHandler
:
  Exit Function

ErrorHandler:
    If 
Not rstUserOnl Is Nothing Then Set rstUserOnl Nothing
    
If Not rst Is Nothing Then Set rst Nothing
    
If Not cnn Is Nothing Then Set cnn Nothing
   
    MsgBox 
"Error: " Err.Number Chr(13) & Err.Description, , "Error: ReturnUserRoster"
    
Resume Exit_ErrorHandler
End 
Function 

-Với "Demo một" RowSource của lstUserOnline mình đã lọc ra danh sách các mẫu tin thỏa cả hai điều kiện UserOnline = -1 và cpuOnline = -1 nên chỉ cần Requery là sẽ cập nhật lên form
-"Demo Hai" và "Demo Ba" dùng cho Unbound form
-Với "Demo Ba" mình không sử dụng đến cpuOnline mà lọc ra danh sách ( từ ds1 và ds2) rồi cập nhật thẳng vào lstUserOnline chứ không cập nhật vào tblUser rồi mới lấy lên lstUserOnline, nên bạn sẽ thấy cách 3 chạy nhanh hơn, tuy nhiên cách này với các bạn mới làm quen với lập trình sẽ thấy khó hiểu đôi chút
-Trong cách 3 nếu bạn bấm "Demo Hai" trước rồi mới bấm "Demo Ba" thì sẽ thấy trong lstUserOnline có tới 3 dòng có tên máy ta đang chạy. Điều đó có nghĩa là chương trình hiện tại đang có 3 kết nối đến CSDl (Recordset của form, Recordset của lstUserOnline và kết nối đang được mở ra của hàm ReturnUserRoster)

Nếu có gì chưa hiểu bạn cứ hỏi hoặc up file của bạn lên mình sẽ hướng dẫn cụ thể hơn! 015

Chúc bạn thành công!

chua hieu nhung y tuong that tuyet voi!!!!
Chữ ký của thucgia Hix, Access quả nhiên lợi hại !!!! http://vibigaba.esy.es/
ღღღღღTài sản của thucgia (View All Items) ღღღღღ
Reply
Những người đã cảm ơn Minh Tiên , MatTroiNguQuen
#17
(08-02-15, 09:29 AM)thucgia Đã viết: chua hieu nhung y tuong that tuyet voi!!!!

Cảm ơn bạn quá khen! 007
Chữ ký của MatTroiNguQuen Thời gian nước chảy... da mòn
Ngủ quên một chốc thấy còn bộ xương!
Reply
Những người đã cảm ơn
#18
Mình tiếp tục bài #15:

Trong file Demo mình lấy code khóa phím Shift từ chủ đề sau:
http://thuthuataccess.com/forum/thread-28.html

phát triển thêm để tiện sử dụng và tránh một số lỗi:
Hàm EnableSHIFT (Click to View)
File ví dụ mình làm theo ý tưởng của bạn mrsiro, tức là sau khi tạo workgroup và hệ phân quyền thì thiết kế tự động đăng nhập, không hiển thị form Logon của Access mà login vào một hệ phân quyền tự tạo
và File ví dụ trả lời cho câu hỏi trong trường hợp trên:
1/làm sao hiển thị các users và máy tính đang link đến CSDL
2/ khóa file .mdw không cho người dùng mở ra xem
Chữ ký của MatTroiNguQuen Thời gian nước chảy... da mòn
Ngủ quên một chốc thấy còn bộ xương!
Reply
Những người đã cảm ơn
#19
Sau đây là một số câu hỏi mình nhận được qua mail:

1/Mở file ldb cũng thấy được tên máy và users, vậy khác với dùng code ở điểm nào?
Nguyên văn câu hỏi: (Click to View)
Vì thời gian khá hạn hẹp nên mình xin trả lời ngắn gọn như sau:
-Đúng là có thể mở file ldb (bằng WordPad) để xem tên máy và Users
-Bản chất của 2 cách khác nhau ở hàm ReturnUserRoster mà mình đã giới thiệu ở trên

2/Sau khi tạo workgroup và hệ phân quyền (như hướng dẫn trong chủ đề này) thì :
a/Có cách nào hiển thị tất cả users và xóa mật khẩu của user bất kỳ?
b/Thiết kế form cho user thay đổi mật khẩu?
c/Thay form Logon của Access bằng một form tự tạo?

Để trả lởi cho các câu hỏi trên xin xem ví dụ sau:
Xem ai dang truy cap CSDL3

Ghi chú:
Ví dụ trên mình tiếp tục phát triển từ file Demo ở bài #15

Nguồn tham khảo:
-Cách tạo workgroup và hệ phân quyền
-Làm sao từng user chỉ sửa được những gì mình nhập?
-http://www.jstreettech.com
-Các hàm về Uesr và Workgroup
-Các hướng dẫn từ MS Office

- Trong file có một số hàm mình tự tạo như MLookup, SetRowSourceForCbo, và TimCtrlBoTrong (để bắt lỗi các điều khiển bắt buộc phải nhập) mình sẽ giới thiệu cùng các bạn khi có dịp

Cuối cùng chúc ban quản trị diễn đàn cùng tất cả các bạn một mùa xuân đầm ấm, hạnh phúc và một năm mới may mắn thành đạt, có nhiều bản viết hay để chia sẻ, chung tay xây dựng diễn đàn ! 015
Chữ ký của MatTroiNguQuen Thời gian nước chảy... da mòn
Ngủ quên một chốc thấy còn bộ xương!
Reply
Những người đã cảm ơn


Có thể liên quan đến chủ đề
Chủ đề: Tác giả Trả lời: Xem: Bài mới nhất
  [Help] Giúp đỡ về cách xóa nội dung trong một field nam8384 2 117 17-10-16, 08:43 PM
Bài mới nhất: toancvp
  [Hỏi] Sử dụng chuột giữa trong subform là report. toancvp 10 358 12-10-16, 01:01 AM
Bài mới nhất: toancvp
  Chèn file văn bản word vào access danhxetnghiem 10 438 11-10-16, 03:42 PM
Bài mới nhất: danhxetnghiem
  Lọc theo điều kiện trong listbox Ranju 3 179 06-10-16, 05:26 PM
Bài mới nhất: Ranju
  Định dạng trong listbox feeling 3 159 06-10-16, 02:44 PM
Bài mới nhất: jeck09nt

Chuyển nhanh:


User(s) browsing this thread: 1 Guest(s)
Diễn Đàn Thơ Văn Thi Ẩm Lâu|Nhà Hàng Sông Thơ