返回列表 上一主題 發帖

[轉貼] 取得系統資訊/使用者資訊

[轉貼] 取得系統資訊/使用者資訊

取得系統資訊/使用者資訊
« 於: 2005-06-08, 21:20:24 »      

--------------------------------------------------------------------------------
1. Excel 版本(代號)
Application.Version

2. Windows 版本
Application.OperatingSystem

3. 剩餘可用的記憶體
Application.MemoryFree (單位為bytes)

另外 Application 有關記憶體的屬性就是
MemoryUsed 和 MemoryTotal,可自行應用。

4. 顯示器的螢幕解析度
'32-bit API declaration
Declare Function GetSystemMetrics Lib "user32" (ByVal nIndex As Long) As Long
Public Const SM_CXSCREEN = 0
Public Const SM_CYSCREEN = 1
Sub ScreenResolution()
  VidWidth = GetSystemMetrics(SM_CXSCREEN)
  VidHeight = GetSystemMetrics(SM_CYSCREEN)
  MsgBox "噫~ 目前螢幕解析度是: " & VidWidth & " X " & VidHeight
End Sub


--------------------------------------------------------------------------------

以下來自 John Walkenbach
For Excel tips, macros, & downloads...
http://j-walk.com/ss

1. 取得電腦名稱

Private Declare Function w32_GetComputerName Lib "kernel32" _
Alias "GetComputerNameA" (ByVal lpBuffer As String, nSize As Long) As Long

Public Function GetComputerName()
  Dim sComputerName As String
  Dim lComputerNameLen As Long
  Dim lResult As Long
  lComputerNameLen = 256
  sComputerName = Space(lComputerNameLen)
  lResult = w32_GetComputerName(sComputerName, lComputerNameLen)
  If lResult <> 0 Then
    GetComputerName = Left(sComputerName, lComputerNameLen)
  Else
    GetComputerName = "Unknown"
  End If
End Function

2. 取得電腦目前登入使用者名稱

Declare Function GetUserName Lib "advapi32.dll" Alias "GetUserNameA" _
 (ByVal lpBuffer As String, nSize As Long) As Long

Function UserName() As String
  Dim Buffer As String * 100
  Dim BuffLen As Long
  BuffLen = 100
  GetUserName Buffer, BuffLen
  UserName = Left(Buffer, BuffLen - 1)
End Function

--------------------------------------------------------------------------------
補充:
其實有些系統/使用者資訊可以由環境變數取得。
參考 用 Environ 取得環境變數~ 不是非要API 啦

向板主檢舉    203.79.168.37 (?)  

--------------------------------------------------------------------------------
BEFORE ASKING, YOU SHOULD RTFH, RTFM, STFW...



leonchou
論壇維護群

離線

文章: 1214


     取得本機資訊補充 - Environ / WshNetwork
&laquo; 回覆文章 #1 於: 2005-09-23, 00:49:13 &raquo;      

--------------------------------------------------------------------------------
Environ 方式列示如下,以求完整:

Sub client_info()

MsgBox "使用者網域" & vbTab & "= " & Environ("UserDomain") & vbLf & _
    "使用者姓名" & vbTab & "= " & Environ("UserName") & vbLf & _
    "電腦名稱 " & vbTab & "= " & Environ("ComputerName")

'PS. Win 9x 不適用

End Sub

另有 WshNetwork 方式:
Sub client_info()
Dim wsh As Object
Set wsh = CreateObject("WScript.Network")
MsgBox "使用者網域" & vbTab & "= " & wsh.UserDomain & vbLf & _
     "使用者姓名" & vbTab & "= " & wsh.UserName & vbLf & _
     "電腦名稱 " & vbTab & "= " & wsh.ComputerName
Set wsh = Nothing

End Sub

主要優缺點比較 --
使用 Environ 的優點是方便,缺點則是 Win9x 不適用;
所以要用哪一種寫法就看各人需求和喜好了。

向板主檢舉    203.79.168.37 (?)  

--------------------------------------------------------------------------------
BEFORE ASKING, YOU SHOULD RTFH, RTFM, STFW...



leonchou
論壇維護群

離線

文章: 1214


     利用WMI 物件取得系統資訊
&laquo; 回覆文章 #2 於: 2005-09-23, 01:01:19 &raquo;      

--------------------------------------------------------------------------------
WMI (Windows Management Instrumentation) 技術是微軟提供的Windows系統管理工具。透過此工具可在本地或管理用戶端系統中取得幾乎一切的資訊。很多專業的網路管理工具都是基於WMI開發的。WMI在Win2000/NT下是標準工具,在Win9x下是選擇性安裝選項。

先來看一個利用WMI取得系統資訊的簡單範例,這個範例透過WMI物件獲得系統中運行的的進程:

Sub wmi_client_info()
Dim system, itm
Dim i As Integer

i = 1
Set system = GetObject("winmgmts:").InstancesOf("Win32_ComputerSystem")
For Each itm In system
  Cells(1, i) = "電腦名稱: " & itm.Name
  Cells(2, i) = "狀態: " & itm.Status
  Cells(3, i) = "類型: " & itm.SystemType
  Cells(4, i) = "生產廠家: " & itm.Manufacturer
  Cells(5, i) = "型號: " & itm.Model
  Cells(6, i) = "記憶體: ~" & itm.totalPhysicalMemory \ 1024000 & "mb"
  Cells(7, i) = "域(工作群組): " & itm.domain
  'Cells(7, i) = "工作組" & itm.Workgroup '不支援Workgroup屬性
  Cells(8, i) = "當前用戶: " & itm.UserName
  Cells(9, i) = "啟動狀態: " & itm.BootupState
  Cells(10, i) = "電腦屬於: " & itm.PrimaryOwnerName
  Cells(11, i) = "系統類型: " & itm.CreationClassName
  Cells(12, i) = "電腦類型: " & itm.Description
  '這裏假設安裝了兩個作業系統
  Cells(13, i) = "啟動選項1 :" & itm.SystemStartupOptions(0)
  Cells(14, i) = "啟動選項2 :" & itm.SystemStartupOptions(1)
  i = i + 1
Next

End Sub


向板主檢舉    203.79.168.37 (?)  

--------------------------------------------------------------------------------
BEFORE ASKING, YOU SHOULD RTFH, RTFM, STFW...



leonchou
論壇維護群

離線

文章: 1214


     利用WMI 物件取得網路卡資訊
&laquo; 回覆文章 #3 於: 2005-09-23, 01:14:20 &raquo;      

--------------------------------------------------------------------------------
現在的電腦以及網路組成十分複雜。例如系統硬體方面就有主板、硬碟、網卡... 等等組件。

軟體方面有作業系統、系統中安裝的軟體、正在運行的進程等等。網路方面有域、工作群組等等。利用WMI可以取得上面的全部資訊,但是如果像上面一樣利用分項來取得的話會很麻煩。因此,WMI提供了一種類似SQL語句的查詢語句,可以藉此獲得WMI物件下的子項。

下面範例是搜索系統中安裝的網卡並返回網卡 IP 及 MAC 位址:

取得本機網卡 IP 位址 --

Sub Get_IP()
Dim objWMI As Object
Dim colIP As Object
strComputer = "."
Set objWMI = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colIP = objWMI.ExecQuery _
 ("Select * from Win32_NetworkAdapterConfiguration where IPEnabled=TRUE")
For Each IP In colIP
 If Not IsNull(IP.IPAddress) Then
   For i = LBound(IP.IPAddress) To UBound(IP.IPAddress)
    MsgBox IP.IPAddress(i), vbInformation, IP.Description(i)
   Next
 End If
Next
End Sub

取得本機網卡 MAC Address (實體位址) --

Sub Get_Mac_Addr()
Dim objWMI As Object
Dim colItems As Object
strComputer = "."
Set objWMI = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colItems = objWMI.ExecQuery("SELECT * FROM Win32_NetworkAdapterConfiguration", _
  "WQL", wbemFlagReturnImmediately + wbemFlagForwardOnly)

For Each objItem In colItems
 MsgBox "MAC Address: " & objItem.MACAddress
Next

End Sub


向板主檢舉    203.79.168.37 (?)  

--------------------------------------------------------------------------------
BEFORE ASKING, YOU SHOULD RTFH, RTFM, STFW...



jerrystone
小學生

離線

文章: 1


     Re: 取得系統資訊/使用者資訊
&laquo; 回覆文章 #4 於: 2008-05-29, 12:35:32 &raquo;      

--------------------------------------------------------------------------------
這篇文章真的超棒的,但請問一下在WMI取得系統資訊的簡單範例那一篇文章,我將程式co到vb底下去run,在Cells的地方它會出現"沒有定義這個sub或function",請問我該如何解決呢?謝謝!!!

向板主檢舉    220.130.36.18 (?)  



d8726228
中學生

離線

文章: 11


     Re: 取得系統資訊/使用者資訊
&laquo; 回覆文章 #5 於: 2008-06-02, 13:59:52 &raquo;      

--------------------------------------------------------------------------------
實作兩種抓取電腦名稱的方法皆成功

十分感謝樓主提供這些超實用資訊  

向板主檢舉    59.125.238.166 (?)  



leonchou
論壇維護群

離線

文章: 1214


     取得Excel系統資訊 - 補充
&laquo; 回覆文章 #6 於: 2008-11-22, 20:23:12 &raquo;      

--------------------------------------------------------------------------------
Application.Version 回傳值與通用名稱的對照表 --

版本名稱 Version回傳值
Excel 2007   12.0
Excel 2003   11.0
Excel 2002   10.0
Excel 2000   9.0
Excel 97  8.0
Excel 95  7.0
Excel 5.0  5.0

Application.Version 回傳值為"字串", 請留意.
若需進一步判斷時, 應視為字串.
例如以下將Excel版本代號轉為通用的名稱 --


程式碼:
Select Case Application.Version
 Case "5.0": verName = "Excel 5.0"
 Case "7.0": verName = "Excel 95"
 Case "8.0": verName = "Excel 97"
 Case "9.0": verName = "Excel 2000"
 Case "10.0": verName = "Excel 2002"
 Case "11.0": verName = "Excel 2003"
 Case "12.0": verName = "Excel 2007"
End Select


--------------------------------------------------------------------------------

取得活頁簿的形式 (以Excel2000為例)


程式碼:
Select Case ThisWorkbook.FileFormat
 Case XlFileFormat.xlExcel5
   MsgBox "這個活頁簿是: Excel95活頁簿"
 Case XlFileFormat.xlExcel7
   MsgBox "這個活頁簿是: Excel97活頁簿"
 Case XlFileFormat.xlWorkbookNormal
   MsgBox "這個活頁簿是: Excel2000活頁簿"
 Case Else
   MsgBox "這個活頁簿是: Excel95/97/2000以外活頁簿"
End Select

向板主檢舉    203.79.168.37 (?)  

--------------------------------------------------------------------------------
BEFORE ASKING, YOU SHOULD RTFH, RTFM, STFW...



leonchou
論壇維護群

離線

文章: 1214


     取得VBA版本/作業系統版本 by WMI
&laquo; 回覆文章 #7 於: 2008-11-22, 20:29:29 &raquo;      

--------------------------------------------------------------------------------
取得VBA版本 by WMI
參考網址 - Microsoft技術文件


程式碼:
Dim WMIServ As Object, objList As Object
basePath = Environ("ProgramFiles") & "\Common Files\Microsoft Shared\VBA"
filePath = Array(basePath, basePath & "\VBA6")
Filename = Array("vbe.dll", "vbe6.dll")
Set WMIServ = GetObject("winmgmts:\\.\root\cimv2")
For i = LBound(filePath) To UBound(filePath)
  Set objList = WMIServ.ExecQuery _
    ("ASSOCIATORS OF {Win32_Directory.Name='" & filePath(i) & _
      "'} Where " & "ResultClass = CIM_DataFile")
  On Error Resume Next
  For Each f In objList
    'If f.Extension = "dll" Then
    If Mid(f.Name, InStrRev(f.Name, "\") + 1) = Filename(i) Then
      MsgBox "您的VBA版本是: " & f.Version
      Exit For
    End If
  Next
Next
Set objList = Nothing: Set WMIServ = Nothing


--------------------------------------------------------------------------------

取得完整的作業系統版本名稱 by WMI
輸出範例: Windows 2000 Professional (5.0.2195)


程式碼:
Dim Locator, Service, objList, msg As String
Set Locator = CreateObject("WbemScripting.SWbemLocator")
Set Service = Locator.ConnectServer
Set objList = Service.ExecQuery("Select * From Win32_OperatingSystem")
For Each os In objList
  msg = msg & os.Caption & vbCrLf
  msg = msg & os.Version
Next os
MsgBox "您的OS版本是: " & msg, vbInformation
Set Service = Nothing
Set objList = Nothing
Set Locator = Nothing

&laquo; 最後編輯時間: 2008-11-22, 20:33:02 由 leonchou &raquo;  向板主檢舉    203.79.168.37 (?)  

--------------------------------------------------------------------------------
BEFORE ASKING, YOU SHOULD RTFH, RTFM, STFW...



xmi
中學生

離線

文章: 42


     Re: 利用WMI 物件取得系統資訊
&laquo; 回覆文章 #8 於: 2008-11-23, 19:14:54 &raquo;      

--------------------------------------------------------------------------------
引用自: leonchou 於 2005-09-23, 01:01:19
WMI (Windows Management Instrumentation) 技術是微軟提供的Windows系統管理工具。透過此工具可在本地或管理用戶端系統中取得幾乎一切的資訊。很多專業的網路管理工具都是基於WMI開發的。WMI在Win2000/NT下是標準工具,在Win9x下是選擇性安裝選項。

先來看一個利用WMI取得系統資訊的簡單範例,這個範例透過WMI物件獲得系統中運行的的進程:

Sub wmi_client_info()
Dim system, itm
Dim i As Integer

i = 1
Set system = GetObject("winmgmts:").InstancesOf("Win32_ComputerSystem")
For Each itm In system
  Cells(1, i) = "電腦名稱: " & itm.Name
  Cells(2, i) = "狀態: " & itm.Status
  Cells(3, i) = "類型: " & itm.SystemType
  Cells(4, i) = "生產廠家: " & itm.Manufacturer
  Cells(5, i) = "型號: " & itm.Model
  Cells(6, i) = "記憶體: ~" & itm.totalPhysicalMemory \ 1024000 & "mb"
  Cells(7, i) = "域(工作群組): " & itm.domain
  'Cells(7, i) = "工作組" & itm.Workgroup '不支援Workgroup屬性
  Cells(8, i) = "當前用戶: " & itm.UserName
  Cells(9, i) = "啟動狀態: " & itm.BootupState
  Cells(10, i) = "電腦屬於: " & itm.PrimaryOwnerName
  Cells(11, i) = "系統類型: " & itm.CreationClassName
  Cells(12, i) = "電腦類型: " & itm.Description
  '這裏假設安裝了兩個作業系統
  Cells(13, i) = "啟動選項1 :" & itm.SystemStartupOptions(0)
  Cells(14, i) = "啟動選項2 :" & itm.SystemStartupOptions(1)
  i = i + 1
Next

End Sub



為什麼我會停在 -->   Cells(6, i) = "記憶體: ~" & itm.totalPhysicalMemory \ 1024000 & "mb"  
我是用office2007的

向板主檢舉    221.127.110.228 (?)  



leonchou
論壇維護群

離線

文章: 1214


     Re: 利用WMI 物件取得系統資訊
&laquo; 回覆文章 #9 於: 2008-11-24, 00:22:56 &raquo;      

--------------------------------------------------------------------------------
引用自: xmi 於 2008-11-23, 19:14:54
為什麼我會停在 -->   Cells(6, i) = "記憶體: ~" & itm.totalPhysicalMemory \ 1024000 & "mb"  
我是用office2007的


在Excel2000+Windows2000 sp2測試正常。

你的錯誤訊息是啥?作業系統的版本?
我想可能是VBA或OS不同,WMI物件屬性也不盡相同的關係...
請和你相同環境的朋友試一下。

向板主檢舉    203.79.168.37 (?)  

--------------------------------------------------------------------------------
BEFORE ASKING, YOU SHOULD RTFH, RTFM, STFW...

請問版主
您文章中所說取得本機網卡 MAC Address 這個部份
所取得的不知是有線網卡的mac或無線網卡的mac呢?
如果我要分別取得2個mac address
程式要如何寫呢?
煩請回覆謝謝
jeason

TOP

請問一下

如果我有一份EXCEL檔案,放在共用的磁碟槽裡

開放給大家使用
(共用EXCEL,人人都可以連到共用磁碟裡開起這份EXCEL)

我能夠記錄正在開啟這份EXCEL檔的使用者名稱和時間點嗎???

謝謝
用功到世界末日那一天~~~

TOP

請問Hsieh大大
如果想從MAC電腦中用OFFICE 2016 FOR MAC取得本機網卡 MAC Address
要如何完成???
jeason

TOP

        靜思自在 : 站在半路,比走到目標更辛苦。
返回列表 上一主題