1. 程式人生 > >計算機信息收集小程序

計算機信息收集小程序

gets scom 執行文件 server oos for into 進入 問題

星期一,領導安排統計公司的計算機設備以便建立臺賬,領導的意思是錄入到EXCEL表裏再進行統計分析,可是這樣的話,兩個地方有200多臺計算機,每臺計算機都需要打開計算機設備信息進行核對錄入,工作量不小,關鍵是這個星期就要見到統計數據。

  用C#寫無疑最快,在C#裏用它本身的類、調用API、調用註冊表都可以實現,問題是編譯成可執行文件到XP、Win32位、Win64位的計算機上有些麻煩,為了盡快完成任務,安裝了Powerbuilder 6.5和Ms Sql Server數據庫,Powerbuilder 6.5可是15年前的編程工具了,忘得差不多了,折騰了3天,完成了信息收集和入庫。

  即將5個程序文件放到網上,通知單位人員下載運行,用戶只需要輸入用戶名進入後點擊【提取計算機信息】,然後保存就好了。

  實現方法比較簡單,首先在註冊表裏收集到具體的硬件信息,記錄下來,然後在Powerbuilder去提取,這些除了內存和硬盤是用了API,其他的(顯卡、網卡、IP地址、子網掩碼、網關等信息)都是在註冊表裏提出來的,沒有分寫代碼方便記錄。

string S1,S2,SInfo,STEMP
long LBuf
long IFOR,I1
RegistryGet("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ComputerName\ComputerName","ComputerName",Regstring!,S1)

dw_1.setitem(dw_1.getrow(),"c05",S1)

//設備ID
RegistryGet("HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\BIOS","SystemManufacturer",Regstring!,S1)
long retVal,a
ulong ll_retval
string ls_format = "0000",str,s_harddiskhex,s_harddiskhex_DB
integer i_len
n_cst_numerical my_hex

//取得SComputerDISKID
str = space(256)
ll_retval = GetVolumeInformationA("c:\", str, 256, RetVal, a, a, str, 256)
s_harddiskhex = my_hex.of_hex(retval)
If len(s_harddiskhex) > 4 then
i_len = len(s_harddiskhex) - 4
s_harddiskhex = upper(left(ls_format, 4 - i_len) + left(s_harddiskhex , i_len) + "-" + right(s_harddiskhex, 4))
End If
S1=S1+"||"+s_harddiskhex
dw_1.setitem(dw_1.getrow(),"c03",S1)
//計算機出廠型號
RegistryGet("HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\BIOS","SystemProductName",Regstring!,S1)
dw_1.setitem(dw_1.getrow(),"c02",S1)
//操作系統
RegistryGet("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\","ProductName",Regstring!,S1)
//判斷是32位還是64位系統
RegistryGet("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment","PROCESSOR_ARCHITECTURE",Regstring!,S2)
choose case S2
case "AMD64"
S2="64位"
case "x86"
S2="32位"
end choose
dw_1.setitem(dw_1.getrow(),"c07",S1+" ["+S2+"]")
/////////////////////////////////計算機的配置參數
//CPU
RegistryGet("HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\CentralProcessor\0","ProcessorNameString",Regstring!,S1)
SInfo=S1
S1=""
//硬盤信息
ulong L1,L2
RegistryGet("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Disk\Enum\","Count",REGuLong!,L1)
for L2=0 to L1 - 1
RegistryGet("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Disk\Enum\",string(L2),Regstring!,S1)
//去掉無用的信息
S1=right(S1,len(S1) - 14)
S1=left(S1,len(S1) - 20)
SInfo=S1+" //// "+SInfo
Next

//內存
strMemory strMemory1
decimal dec1
GlobalMemoryStatus(strMemory1)
dec1=(strMemory1.ultotalsize)/(102410241024)
dec1=dec1*2
S1=string(Round(dec1,0))+"G"
SInfo=S1+" |||| "+SInfo

//顯卡
RegistryGet("HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\services\nvlddmkm\Device0","Device Description",Regstring!,S1)
SInfo=S1+" |||| "+SInfo
dw_1.setitem(dw_1.getrow(),"c04",SInfo)

//網絡信息
String SSubkeylist[],SNetInfo[]
RegistryKeys("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\TCPIP\Parameters\Interfaces\",SSubkeylist)
for IFOR=1 to upperbound(SSubkeylist)
STEMP=SSubkeylist[IFOR]
//IP地址
RegistryGet("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\TCPIP\Parameters\Interfaces\"+STEMP,"IPAddress",RegMultiString!,SNetInfo)
dw_1.setitem(dw_1.getrow(),"c10",SNetInfo[1])
SNetInfo[1]=‘‘
//子網掩碼
RegistryGet("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\TCPIP\Parameters\Interfaces\"+STEMP,"SubnetMask",RegMultiString!,SNetInfo)
dw_1.setitem(dw_1.getrow(),"c11",SNetInfo[1])
SNetInfo[1]=‘‘
//網關
RegistryGet("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\TCPIP\Parameters\Interfaces\"+STEMP,"DefaultGateway",RegMultiString!,SNetInfo)
S1=SNetInfo[1]
dw_1.setitem(dw_1.getrow(),"c12",SNetInfo[1])
if not ( IsNULL(S1) or S1="" ) then
goto Label1
end if
next
Label1:
//取最大值
select Max(c01) into :L1 from computerlist using XXSDB;
L1=L1+1
dw_1.setitem(dw_1.getrow(),"c01",L1)
datetime MyDT
MyDT=gf_getserverdatetime()
dw_1.setitem(dw_1.getrow(),"c17",MyDT)
dw_1.setitem(dw_1.getrow(),"c16",SServerUser)

  API信息:
  PUBLIC Subroutine GlobalMemoryStatus(ref strmemory lpBuffer) LIBRARY "kernel32.dll"
  Function ulong GetVolumeInformationA ( string lpRootPathName , ref string pVolumeNameBuffer , long nVolumeNameSize , ref long lpVolumeSerialNumber , ref long lpMaximumComponentLength , ref long lpFileSystemFlags , ref string lpFileSystemNameBuffer , long nFileSystemNameSize ) Library "kernel32"?
  還有結構體聲明:
技術分享圖片
  最後就是編譯為一個可執行文件,編譯前一定做好備份,否則一點點的錯誤就會導致文件被破壞,比較麻煩。
  發行的文件為綠色文件,沒做安裝包,總共5個文件包括可執行文件:CMIMS.exe、pbvm60.dll、pbmss60.dll、pbdwe60.dll、ntwdblib.DLL。目前,在WinXP、Win7-32位|64位、Win10的計算機上運行正常。
  數據庫是MS Sql Server 2000。
技術分享圖片

計算機信息收集小程序