2014年7月3日 星期四

VB.NET 登錄檔Regedit本機與遠端,寫入與讀取

        在自動化產業上,單站Tektime的處理時間越短,相對的產能也就會越高 ; 在軟體方面,有時候為了達到有充裕的效能,或者節省成本的考量,常常會出現一台電腦(主機)對多台電腦(子機)的搭配使用,以達效率的提升.

        這樣的模式下,主機對子機間,或子機對子機間的溝通,就顯得非常重要,一般我們常見的溝通模式可能是透過讀取.txt或.ini,或者用WinSocket的傳遞方式,取得相關資訊來判斷該做什麼動作,這些方式都可以達到一對多的控制,但考慮穩定度與處理時間,這邊介紹一個通訊的方法,透過Regedit的模式來達到一樣的效果,且方法簡單,穩定,也快速.

本文的環境設定為 Win7 64bit
a.確保多台電腦 連接網路,且網域要一致,IP不重複
b.確保多台電腦 同群組
c.確保多台電腦 控制台->系統及安全性->系統管理工具->服務 裡面的Remote Registry 已啟動
d.確保多台電腦 防火牆關閉

主機端 :

開啟 regedit.exe ,在資料夾圖示上可按右鍵新增,請建立好
HKEY_CURRENT_USER\Software\ATMA\ATAE57 機碼

ATAE57 機碼內新增一個Is_Alive(Type:DWORD)的子機碼,數值暫設為99(10進位)

依據電腦身分設定ATAE57 機碼的使用權限,在資料夾圖示上方按右鍵便可看到



到這邊為止,基本上已經建立好通訊的目錄了,接著介紹如何透過程式讀取與寫入

假設.主機IP = 192.168.1.99 / 子機IP = 192.168.1.1

主機對主機 讀取語法 GetValue承接讀取的值
Dim RegistryKey As Microsoft.Win32.RegistryKey
Dim GetValue As String
RegistryKey = Microsoft.Win32.RegistryKey.OpenBaseKey(Microsoft.Win32.RegistryHive.CurrentUser, Microsoft.Win32.RegistryView.Registry64).OpenSubKey("HKEY_CURRENT_USER\Software\ATMA\ATAE57", False)
GetValue = RegistryKey.GetValue("Is_Alive", "")
RegistryKey.Close()

主機對主機 寫入語法 將值改為22
Dim RegistryKey As Microsoft.Win32.RegistryKey
RegistryKey = Microsoft.Win32.RegistryKey.OpenBaseKey(Microsoft.Win32.RegistryHive.CurrentUser, Microsoft.Win32.RegistryView.Registry64).OpenSubKey("HKEY_CURRENT_USER\Software\ATMA\ATAE57", True)
RegistryKey.SetValue("Is_Alive", "22")
RegistryKey.Close()

子機對主機 讀取語法 GetValue承接讀取的值
Dim RegistryKey As Microsoft.Win32.RegistryKey
Dim GetValue As String
RegistryKey = Microsoft.Win32.RegistryKey.OpenRemoteBaseKey(Microsoft.Win32.RegistryHive.CurrentUser, "192.168.1.99", Microsoft.Win32.RegistryView.Registry64).OpenSubKey("HKEY_CURRENT_USER\Software\ATMA\ATAE57", False)
GetValue = RegistryKey.GetValue("Is_Alive", "")
RegistryKey.Close()

子機對主機 寫入語法 將值改為33
Dim RegistryKey As Microsoft.Win32.RegistryKey
RegistryKey = Microsoft.Win32.RegistryKey.OpenRemoteBaseKey(Microsoft.Win32.RegistryHive.CurrentUser, "192.168.1.99", Microsoft.Win32.RegistryView.Registry64).OpenSubKey("HKEY_CURRENT_USER\Software\ATMA\ATAE57", True)
RegistryKey.SetValue("Is_Alive", "33")
RegistryKey.Close()

以上,可以同時與regedit.ext(不會自動更新 需要按F5)搭配確認是否讀取與寫入無誤!!

沒有留言:

張貼留言