Đá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
#1
Nhờ các bác hướng dẫn giúp em làm cách nào để biết máy tính nào trong mạng LAN đang mở file chương trình ( file share hoặc file data dùng back/end ). Em muốn tạo một form cho admin, form này khi mở lên sẽ biết được các thông số như : máy tính đang truy cập dự liệu, biết được họ dùng username gì để vào chương trình, thời gian vào được bao lâu ???

Thank các Bác nhiều.
Chữ ký của connguoi123 Hãy chia sẻ kinh nghiệm cùng mình trên ThuThuatAccess nhé! Chúc vui vẻ rose
Reply
Những người đã cảm ơn
#2
(11-02-14, 03:55 PM)connguoi123 Đã viết: Nhờ các bác hướng dẫn giúp em làm cách nào để biết máy tính nào trong mạng LAN đang mở file chương trình ( file share hoặc file data dùng back/end ). Em muốn tạo một form cho admin, form này khi mở lên sẽ biết được các thông số như : máy tính đang truy cập dự liệu, biết được họ dùng username gì để vào chương trình, thời gian vào được bao lâu ???

Thank các Bác nhiều.

để lấy tên máy tính đang truy cập bạn dùng hàm Environ("ComputerName")
để biết username login vào thì bạn tạo thêm 1 table nhật ký chứa toàn bộ thông tin trong ngày giờ login vào. dùng hàm Now() còn thời gian dùng đc bao lâu thì hơi bị khó ở chỗ xác định thời gian tắt chương trình, ta cần tạo nút lệnh thoát thoát để lấy ngày giờ lúc thoát để tính ra thời gian sử dụng, giả sử đang dùng mà cúp điện đột ngột thì ko biết ghi thông tin vào table log như thế nào hoặc người dùng thay đổi ngày giờ thì cũng hơi bị khó.
p/s: ý kiến của mình chỉ dựa theo sự suy nghĩ và phỏng đoán của mình là vậy, bro nào có ý kiến thêm xin mời góp ý big green
Chữ ký của quan_pc Lắp đặt Internet VNPT tại Điện Bàn - Quảng Nam - Hotline: 0915.636.745
ღღღღღTài sản của quan_pc (View All Items) ღღღღღ
Reply
Những người đã cảm ơn connguoi123 , Noname , thanhtruong
#3
Cám ơn Bác Quan_PC đã quan tâm đến chủ đề của em, em cũng đã thử đưa hàm đó lên form nhưng nó chỉ ra lấy được tên của chính cái máy tính mình đang dùng để mở form đó thôi, Ý của em là làm sao lấy được tất cả các máy tính trong mạng LAN đang cùng truy cập chương trình đó cơ. Bác có ý tưởng nào nũa ko , hướng dẫn em với.

Tks alots.
Chữ ký của connguoi123 Hãy chia sẻ kinh nghiệm cùng mình trên ThuThuatAccess nhé! Chúc vui vẻ rose
Reply
Những người đã cảm ơn
#4
(11-02-14, 03:55 PM)connguoi123 Đã viết: Nhờ các bác hướng dẫn giúp em làm cách nào để biết máy tính nào trong mạng LAN đang mở file chương trình ( file share hoặc file data dùng back/end ). Em muốn tạo một form cho admin, form này khi mở lên sẽ biết được các thông số như : máy tính đang truy cập dự liệu, biết được họ dùng username gì để vào chương trình, thời gian vào được bao lâu ???

Thank các Bác nhiều.

Bạn Tham khảo link sau:
Use ADO to Return a List of Users Connected to a Database
http://msdn.microsoft.com/en-us/library/...e.10).aspx

Hoặc:
http://support.microsoft.com/kb/285822

Với link trên ta có hàm ReturnUserRoster() để lấy về tên máy tính đang truy cập CSDL. Tuy nhiên để biết được user nào đang đăng nhập thì mình có ý tưởng như sau:
-Tạo table: tblUser(UserName, Password, UserOnline, LogTime, Computername, CpuOnline) -chi tiết Xem trong Demo
-Tạo Update query để đặt UserOnline = false cho tất cả record có Computername trùng với tên máy đang sử dụng và gọi query này khi thoát form chính (thoát chương trình)
-Khi đăng nhập ta set UserOnline = True
-Sử dụng hàm ReturnUserRoster() để lấy về tên các máy tính đang kết nối đến CSDl.
Kết hợp 2 điều kiện trên ta sẽ biết được tên máy tính và User đang sử dụng CSDL

Trong bản Demo mình có dùng một module (sưu tầm và có chỉnh sửa) để tự động liên kết lại table nếu front-end và back-end cùng chung thư mục. Bạn tải về giải nén rồi share full , copy file "Demo Return a List of Users Connected to a Database" sang máy khác, chạy file này, khi load main form sẽ mở ra cửa sổ để chọn đường dẫn tới file Demo_Database (back-end). mở frmUserList để xem các máy đang kết nối đến Demo_Database

frmUserList mình sử dụng 3 cách khác nhau để lấy danh sách user và Computername

File download:
Demo Return a List of Users

Hình minh họa:
[Hình: 1041548364_654399240_574_574.jpg]

P/s: đây chỉ là ví dụ minh họa, chưa hoàn chỉnh, frmUserList không phải là form login đâu nha, có gì thắc mắc bạn cứ hỏi nhé 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 connguoi123 , gaubu117 , Noname , Minh Tiên
#5
Cám ơn bác MatTroiNguQuen rất nhiều, đúng cái ý mình đang cần tìm hiểu rồi, thêm nữa Bác có thể cho em hỏi với Demo của Bác mới chỉ biết được User và PC nào "ĐÃ" truy cập dữ liệu thôi, còn muốn biết tại thời điểm này User và PC nào"ĐANG" truy cập dữ liệu thì có được không ? Mong bác chỉ giáo tiếp.

TKs alot
Chữ ký của connguoi123 Hãy chia sẻ kinh nghiệm cùng mình trên ThuThuatAccess nhé! Chúc vui vẻ rose
Reply
Những người đã cảm ơn
#6
Không phải "ĐÃ" truy cập dữ liệu mà là đã kết nối và đang truy cập CSDL. Hàm ReturnUserRoster() trả về tên các computer và người dùng hiện đang truy cập đến CSDl (Returning the current users) .
Tuy nhiên ta không phân quyền user trên CSDL (back end) mà trên Ứng dụng (front end) nên không thể sử dụng LOGIN_NAME trả về từ hàm ReturnUserRoster (như hướng dẫn của MS ở link trên) mà phải chế biến như Demo của mình

Lúc viết bài trên mình có một sai sót là dùng chuỗi kết nối đến chương trình đang chạy (front end) nên chỉ thấy được tên máy đang sử dụng. Hôm sau vào cơ quan test thử mới té ngửa 014 (Đã sửa lại và up lại link vào chiều 17/2 - Vì khi đó chưa thấy lượt tải nào nên mình không thông báo lên đây - Sorry)

Bạn đã test thử chưa nhỉ? 027
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 gaubu117
#7
Mình vừa thêm vào một combo box để liệt kê ra tất cả các UserName và ComputerName có trong bảng tblUser :

[Hình: 1043634942_1716348685_574_574.jpg]

-Sau khi chọn UserName (ở cbo "Chọn Username") > bấm nút "Lưu đăng nhập" > bấm nút "Demo Một"
Bạn sẽ thấy cbo dưới cùng xổ xuống danh sách tất cả các User, đồng thời cột Useronline và Cpuonline sẽ cho biết tên người dùng và máy tính nào đang hoạt động (trả về giá trị -1 hoặc yes)

File download Demo 21-2-14

Trong bản cập nhật này mình có dùng hàm fSetRowSource đã được xây dựng để có thể dùng chung cho tất cả các Combo Box và List Box.
Hàm fSetRowSource (Click to View)
Chúc các bạn một buổi tối lãng mạn và có nhiều giấc mơ ngọt ngào! 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 connguoi123 , maidinhdan
#8
Thank you Bác MatTroiNguQuen rất rất nhiều, em sẽ nghiên cứu phần hướng dẫn của Bác để áp dụng, mong rằng Bác sẽ chia sẻ thêm nhiều tuyệt chiêu nữa .
Chữ ký của connguoi123 Hãy chia sẻ kinh nghiệm cùng mình trên ThuThuatAccess nhé! Chúc vui vẻ rose
Reply
Những người đã cảm ơn
#9
Bác MatTroiNguQuen ơi, em thấy trong cái Demo của Bác cái field Useronline và CpuOnline là em thấy đang bị rối quá, em đã thử làm như của bác ( Copy và modify 1 tý) nhưng vẫn không hiểu được lúc nào thì 2 filed này ở giá trị False/true. Em đã coi lại các đoạn code mà vẫn chưa ra. Bác có thể giải thích giúp em được không ?
Chữ ký của connguoi123 Hãy chia sẻ kinh nghiệm cùng mình trên ThuThuatAccess nhé! Chúc vui vẻ rose
Reply
Những người đã cảm ơn
#10
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!
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 thucgia


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 178 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ơ