Lập trình VBA và API trong Excel để lấy tên máy tính và tên đăng nhập Windows

Liên hệ QC

Nguyễn Duy Tuân

Nghị Hách
Thành viên danh dự
Tham gia
13/6/06
Bài viết
4,737
Được thích
10,242
Giới tính
Nam
Nghề nghiệp
Giáo viên, CEO tại Bluesofts
Trong lập trình VBA trong Excel, để lấy tên máy tính, tên đăng nhập Windows không có hàm nào cung cấp mà chúng ta phải sử dụng các hàm Windows API để lấy thông tin. Kỹ thuật lập trình Windows API rất hay và thú vị vì cho phép can thiệt sâu và hệ thống, tuy nhiên hiện nay ít người biết đến nó. Bài hướng dẫn này của tôi ngắn gọn, giúp các bạn lấy thông tin tên máy tính và tên đăng nhập, chỉ cần copy đoạn code dưới đây vào module trong VBAProject của mình.
lay-ten-may-tinh-ten-dang-nhap-windows-vba-api.png
MÃ NGUỒN TẠI ĐÂY:
Mã:
'==========================================
Function ComputerName() As String
   Dim Buf As String * 255, n&
   If GetComputerName(Buf, 255) Then
      ComputerName = Left(Buf, InStr(Buf, Chr(0)) - 1)
   Else
      ComputerName = "Error! gui loi ve cho toi duytuan@bluesofts.net de tim nguyen nhan."
   End If
End Function
Function UserName() As String
   Dim Buf As String * 255, n&
   If GetUserName(Buf, 255) Then
      UserName = Left(Buf, InStr(Buf, Chr(0)) - 1)
   Else
      UserName = "Error! gui loi ve cho toi duytuan@bluesofts.net de tim nguyen nhan."
   End If
End Function
'==========================================
 
Trong lập trình VBA trong Excel, để lấy tên máy tính, tên đăng nhập Windows không có hàm nào cung cấp mà chúng ta phải sử dụng các hàm Windows API để lấy thông tin. Kỹ thuật lập trình Windows API rất hay và thú vị vì cho phép can thiệt sâu và hệ thống, tuy nhiên hiện nay ít người biết đến nó. Bài hướng dẫn này của tôi ngắn gọn, giúp các bạn lấy thông tin tên máy tính và tên đăng nhập, chỉ cần copy đoạn code dưới đây vào module trong VBAProject của mình.
lay-ten-may-tinh-ten-dang-nhap-windows-vba-api.png
MÃ NGUỒN TẠI ĐÂY:
Mã:
'==========================================
Function ComputerName() As String
   Dim Buf As String * 255, n&
   If GetComputerName(Buf, 255) Then
      ComputerName = Left(Buf, InStr(Buf, Chr(0)) - 1)
   Else
      ComputerName = "Error! gui loi ve cho toi duytuan@bluesofts.net de tim nguyen nhan."
   End If
End Function
Function UserName() As String
   Dim Buf As String * 255, n&
   If GetUserName(Buf, 255) Then
      UserName = Left(Buf, InStr(Buf, Chr(0)) - 1)
   Else
      UserName = "Error! gui loi ve cho toi duytuan@bluesofts.net de tim nguyen nhan."
   End If
End Function
'==========================================
Thấy trong VBA có hàm ENVIRON cũng làm được điều này
?Environ("USERNAME") ---> Cho kết quả TÊN ĐĂNG NHẬP
?Environ("COMPUTERNAME") ---> Cho kết quả TÊN MÁY TÍNH
 
Upvote 0
Thấy trong VBA có hàm ENVIRON cũng làm được điều này
?Environ("USERNAME") ---> Cho kết quả TÊN ĐĂNG NHẬP
?Environ("COMPUTERNAME") ---> Cho kết quả TÊN MÁY TÍNH

Đúng rồi anh, cách đó ngắn gọn. Bài viết này dùng kỹ thuật ứng dụng hàm API dạng lấy chuỗi, sau này ai cần lấy chuỗi mà phải dùng đến các hàm Windows API thì cứ theo cấu trúc code này là ok.
 
Upvote 0
Upvote 0
Cám ơn các Anh nhìu !
 
Upvote 0
Cái này có thể sử dụng luôn ở VB6 anh Tuân nhỉ?
VB6 cũng nhiều lựa chọn lắm thầy à! Không API vẫn còn hàng đống cách khác: DOS Command nè, WshNetwork object nè... vân vân...
Ví dụ dùng WshNetwork object
CreateObject("WScript.Network").ComputerName ---> Cho kết quả là Computer Name
CreateObject("WScript.Network").UserName
---> Cho kết quả là User Name
Ngoài ra còn có Windows Management Instrumentation (WMI) mà tôi cho là giải pháp toàn diện nhất. Chỉ duy nhất 1 em WMI này thôi là có thể làm mọi thứ liên quan đến hệ thống
 
Upvote 0
VB6 cũng nhiều lựa chọn lắm thầy à! Không API vẫn còn hàng đống cách khác: DOS Command nè, WshNetwork object nè... vân vân...
Ví dụ dùng WshNetwork object
CreateObject("WScript.Network").ComputerName ---> Cho kết quả là Computer Name
CreateObject("WScript.Network").UserName
---> Cho kết quả là User Name
Ngoài ra còn có Windows Management Instrumentation (WMI) mà tôi cho là giải pháp toàn diện nhất. Chỉ duy nhất 1 em WMI này thôi là có thể làm mọi thứ liên quan đến hệ thống

Nhiều cách phết bác nhỉ, em hiện dùng Windows Management Instrumentation.
 
Upvote 0
Gửi anh Nguyễn Duy Tuân,
(Không liên quan tới nội dung chủ đề) Em thấy bức ảnh ở bài #1 mà không có dòng thông báo: Microsoft Excel (Product Activation Failed) thì tốt hơn với bài viết là của anh.
Bởi anh là đại diện của công ty phân phối sản phẩm thương mại nhúng với Microsoft Excel (cho dù sản phẩm đó không sử dụng Microsoft Excel để viết).





 
Upvote 0
Gửi anh Nguyễn Duy Tuân,
(Không liên quan tới nội dung chủ đề) Em thấy bức ảnh ở bài #1 mà không có dòng thông báo: Microsoft Excel (Product Activation Failed) thì tốt hơn với bài viết là của anh.
Bởi anh là đại diện của công ty phân phối sản phẩm thương mại nhúng với Microsoft Excel (cho dù sản phẩm đó không sử dụng Microsoft Excel để viết).

HI. Cảm ơn bạn mình sẽ sửa lại :)
 
Upvote 0
VB6 cũng nhiều lựa chọn lắm thầy à! Không API vẫn còn hàng đống cách khác: DOS Command nè, WshNetwork object nè... vân vân...
Ví dụ dùng WshNetwork object
CreateObject("WScript.Network").ComputerName ---> Cho kết quả là Computer Name
CreateObject("WScript.Network").UserName
---> Cho kết quả là User Name
Ngoài ra còn có Windows Management Instrumentation (WMI) mà tôi cho là giải pháp toàn diện nhất. Chỉ duy nhất 1 em WMI này thôi là có thể làm mọi thứ liên quan đến hệ thống
Nếu được phiền Anh chỉ dùm cách sử dụng WMI ... này với ... Em chưa hình dung ra cách xài làm sao !!!
Em cảm Ơn
 
Upvote 0
Nếu được phiền Anh chỉ dùm cách sử dụng WMI ... này với ... Em chưa hình dung ra cách xài làm sao !!!
Em cảm Ơn
Tìm mấy bài viết liên quan đến lấy serial number, toàn dùng WMI cả
Có khi bạn đã dùng rồi nhưng chưa biết "nó" gọi là WMI thôi
 
Upvote 0
Tìm mấy bài viết liên quan đến lấy serial number, toàn dùng WMI cả
Có khi bạn đã dùng rồi nhưng chưa biết "nó" gọi là WMI thôi
Hay nó đây phải không Anh
Mã:
Function GetBoardSerial()
  Dim obj As Object
  Application.Volatile
  With GetObject("winmgmts:\\.\root\cimv2")
    For Each obj In .ExecQuery("Select * from Win32_BaseBoard")
      GetBoardSerial = obj.SerialNumber
    Next
  End With
   MsgBox GetBoardSerial
End Function
Function GetCPUID()
  Dim objItem As Object
  Application.Volatile ''Cap nhat su thay doi cho Ham tu tao
  With GetObject("winmgmts:\\.\root\cimv2")
    For Each objItem In .ExecQuery("Select * from Win32_Processor")
      GetCPUID = objItem.ProcessorId
    Next
  End With
  'MsgBox GetCPUID
End Function
 
Lần chỉnh sửa cuối:
Upvote 0
Hay nó đây phải không Anh
Mã:
Function GetBoardSerial()
  Dim obj As Object
  Application.Volatile
  With GetObject("winmgmts:\\.\root\cimv2")
    For Each obj In .ExecQuery("Select * from Win32_BaseBoard")
      GetBoardSerial = obj.SerialNumber
    Next
  End With
   MsgBox GetBoardSerial
End Function
Function GetCPUID()
  Dim objItem As Object
  Application.Volatile ''Cap nhat su thay doi cho Ham tu tao
  With GetObject("winmgmts:\\.\root\cimv2")
    For Each objItem In .ExecQuery("Select * from Win32_Processor")
      GetCPUID = objItem.ProcessorId
    Next
  End With
  'MsgBox GetCPUID
End Function
Chính nó đó!
Dùng WMI ăn tiền nằm ở mấy câu truy vấn (giống giống ADO) cho nên nếu không nhớ nỗi mấy câu này thì coi như.. thua
Topic này đang bàn về API nên không thích hợp đưa các bài viết không liên quan. Để hôm nào có dịp tôi sẽ gửi lên 1 file tổng hợp chuyên về WMI cho mọi người tham khảo (đương nhiên sẽ gửi vào 1 topic phù hợp và dành cho những người có hứng thú với nó)
 
Upvote 0
Chính nó đó!
Dùng WMI ăn tiền nằm ở mấy câu truy vấn (giống giống ADO) cho nên nếu không nhớ nỗi mấy câu này thì coi như.. thua
Topic này đang bàn về API nên không thích hợp đưa các bài viết không liên quan. Để hôm nào có dịp tôi sẽ gửi lên 1 file tổng hợp chuyên về WMI cho mọi người tham khảo (đương nhiên sẽ gửi vào 1 topic phù hợp và dành cho những người có hứng thú với nó)

Em hóng bài của thầy. Cái này có vẻ rất thú vị :)
 
Upvote 0
Lấy thông tin phần cứng như CPU, HĐ Serial,... các hàm API hay
Em hóng bài của thầy. Cái này có vẻ rất thú vị :)

Lấy Serial chuẩn không ngon ăn đâu nhé. Người ngoài còn tạo riêng DLL chỉ để cung cấp hàm nhận Serial chuẩn để ăn $ đó. Các cách làm chuẩn của Windows bằng API hay WMI đều gặp vấn đề khi máy Ghost đĩa (serial giống nhau một loạt), Windows 64-bit thì sai serial, phụ thuộc user đăng nhập Windows có phải Administrator hay không....

Mã nguồn để làm việc này bằng API lấy ngày trên trang Microsoft đây nhưng cũng không chuẩn:
https://social.msdn.microsoft.com/F...-serial-number-using-vb-60?forum=vbpowerpacks
 
Upvote 0
Mình vừa tạo video hướng dẫn lập trình VBA kết hợp hàm trong Windows API để nhận tên máy tính. Video này hướn dẫn cách chúng ta tự khai báo hàm API trong VBA từ thư viện của Microsoft với ngôn ngữ C, ví dụ cũng chỉ ra cách chúng ta khởi tạo biến nhớ kiểu String để dùng trong function API nhận chuỗi ký tự.

 
Upvote 0
Mình vừa tạo video hướng dẫn lập trình VBA kết hợp hàm trong Windows API để nhận tên máy tính. Video này hướn dẫn cách chúng ta tự khai báo hàm API trong VBA từ thư viện của Microsoft với ngôn ngữ C, ví dụ cũng chỉ ra cách chúng ta khởi tạo biến nhớ kiểu String để dùng trong function API nhận chuỗi ký tự.

AnNh Tuân cho em hỏi 1 câu ngớ ngẩn: Trong VBA có lệnh Environ$("computername") để lấy tên máy tính, làm sao phải dùng cách dài như của anh hướng dẫn ?
 
Upvote 0
AnNh Tuân cho em hỏi 1 câu ngớ ngẩn: Trong VBA có lệnh Environ$("computername") để lấy tên máy tính, làm sao phải dùng cách dài như của anh hướng dẫn ?
Trong lập trình VBA trong Excel, để lấy tên máy tính, tên đăng nhập Windows không có hàm nào cung cấp mà chúng ta phải sử dụng các hàm Windows API để lấy thông tin
:D
 
Upvote 0
AnNh Tuân cho em hỏi 1 câu ngớ ngẩn: Trong VBA có lệnh Environ$("computername") để lấy tên máy tính, làm sao phải dùng cách dài như của anh hướng dẫn ?

Đúng rồi. Trong VBA chúng ta vẫn có cách để lấy tên máy tính hay một số thông tin hệ thống (bái viết cũ mình có nói không lấy được là không đúng :) ). Kiến thức mà mình chia sẻ ở đây là cách dùng hàm API. Như video vừa đăng mình mô tả cách mà chúng ta tự lấy thư viện từ Microsoft để định nghĩa trong VBA. Nếu nắm được cách dùng hàm Windows API thì chúng ta còn làm rất nhiều việc nữa vì Windows cung cấp rất nhiều các hàm hữu ích để khai thác đưa vào ứng dụng của mình.
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom