獲取系統上的用戶注冊信息
發表于:2007-07-14來源:作者:點擊數:
標簽:
作者: 小林 問題 有的 程序員 希望能夠顯示當前安裝的 Windows 版本的注冊用戶的信息,此信息包括用戶名和單位。但 似乎找不到一個 Windwos API 函數來完成此功能。 方法 由于沒有直接的方法來實現此功能,因此也就找不到單個的 Windows API 函數來顯示注冊
作者: 小林
問題
有的
程序員希望能夠顯示當前安裝的 Windows 版本的注冊用戶的信息,此信息包括用戶名和單位。但 似乎找不到一個 Windwos API 函數來完成此功能。
方法
由于沒有直接的方法來實現此功能,因此也就找不到單個的 Windows API 函數來顯示注冊信息,只能 由程序員以高超的編程技巧聯合好幾個 Windows API 函數來完成此功能。
有關 Windows 系統注冊用戶的姓名和單位的信息實際上是保存在 Windows 的系統注冊表中。要獲取這 些信息,則需要打開注冊表,找到正確的條目,然后取回所查找的關鍵字的值。
在本節中,將介紹如何在新的 Windows 9x 注冊表
數據庫中查找適當的關鍵字及其值,從而完成檢索用 戶信息的任務。
步驟
按照下列步驟實現一個例子程序。運行此例子程序,選擇菜單 SysInfo 中選擇菜單項 registration, 則彈出一個對話框,顯示 Windows 系統注冊用戶的姓名和單位。
實現例子程序的具體步驟如下:
1.在 Visual C++ 中,利用 AppWizard 創建新的項目文件,并命名此項目文件為 LD15.MAK.
2.進入 AppStudio 并創建新的對話框,添加兩個靜態文本域,標題分別為 User name 和 Organization。
3.與前兩個靜態文本域對齊,創建另外兩個靜態文本域,標題為空,ID 分別為 ID_USER_NAME 和 ID_ORGANIZATION。
4.改變對話框 ID 為 ID_USER_INFO,改變對話框標題為 User Registration Information。
5.進入 ClassWizard,選擇按鈕 Add Class。命名新類為 CUserRegDlg,選擇基類為 CDIALOG, 并接受源代碼和文件名和頭文件名的缺省值。
6.在 ClassWizard,從對象 ID 中選擇對象 CUserRegDlg ,選擇消息 WM_INI
TDIALOG,點擊按鈕 Add Function,在函數 OnInitDialog 中輸入下列代碼:
BOOL CUserRegDlg::OnInitDialog()
{
CDialog::OnInitDialog();
HKEY hkRoot,hkSubKey;
if(RegOpenKey(HKEY_LOCAL_MACHINE,NULL,&hkRoot)==ERROR_SU
CCESS)
{
if(RegOpenKeyEx(hkRoot,
"SOFTWARE\\
MICROSOFT\\Windows\\CurrentVersion\\",
0,KEY_ENUMERATE_SUB_KEYS|KEY_EXECUTE|KEY_QUERY_VALUE,
&hkSubKey)==ERROR_SUCCESS)
{
char ValueName[256];
unsigned char DataValue[256];
unsigned long cbValueName=256;
unsigned long cbDataValue=256;
DWORD dwType;
if(RegEnumValue(hkSubKey,4,ValueName,&cbValueName,NULL,
&dwType,DataValue,&cbDataValue)==ERROR_SUCCESS)
{
GetDlgItem(ID_USER_NAME)->
SetWindowText((char *)DataValue);
}
cbValueName=256;
cbDataValue=256;
if(RegEnumValue(hkSubKey,5,ValueName,&cbValueName,NULL,
&dwType,DataValue,&cbDataValue)==ERROR_SUCCESS)
{
GetDlgItem(ID_ORGANIZATION)->
SetWindowText((char *)DataValue);
}
RegCloseKey(hkSubKey);
}
RegCloseKey(hkRoot);
}
return TRUE; // return TRUE unless you set the focus to a control
}
7.返回 AppStudio,選擇菜單 IDR_MAUNFRAME。在主菜單 SysINfo 中添加新的菜單項 User Registration,ID 為 ID_USER_REGISTRATION。
8.進入 ClassWizard,從下拉列表中選擇類 CMainFrame,從對象 ID 列表中選擇對象 ID_USER_REGISTRATION,從消息列表中選擇消息 COMMAND。點擊按鈕 Add Function,函數命名為 OnUserRegistration。
9.選擇按鈕 Edit Code,在方法 OnUserRegistration 中輸入下列代碼:
void CMainFrame::OnUserRegistration()
{
CUserRegDlg dlg;
dlg.DoModal();
}
10.在文件 MAINFRM.CPP 的頂部添加下列行:
#include "UserRegDlg.h"
11.編譯并運行此例子程序。
用法
要檢索用戶信息,首先要打開并瀏覽 Windows 9x 的注冊數據庫。在此數據庫中是一個包含 Windows 9x 系統各方面信息的關鍵字的層次集合。其中一個關鍵字可以按路徑 SOFTWARE\\MICROSOFT\\Windows\\ CurrentVersion\來查找,此關鍵字包含檢索用戶名和單位的有用信息。
首先,必須打開注冊數據庫。要做到這一點,需要選擇數據庫中的一個根層次關鍵字并打開它。在本節 的例子程序中,此根層次關鍵字為 HKEY_LOCAL_MACHINE,調用 API 函數 RegOpenKey(或 RegOpenKeyEx) 打開此根層次關鍵字,然后調用函數 RegOpenKeyEx(在例子程序中示范了這兩個函數的使用,其實任一函數 都可用于這兩種情況)打開子關鍵字,并且獲得關鍵字 CurrentVersion 的句柄。
一旦從注冊數據庫中檢測到句柄,就可以調用函數 RegEnumValue 來檢索此關鍵字的某個值。在本節的 例子程序中,我們感興趣的兩個值序號分別為4和5。一旦檢索這兩個值,就將其放置在對話框的靜態文本 域中,并通過關閉所有打開的關鍵字來關閉數據庫。關閉注冊關鍵字句柄是通過調用 API 函數 RegCloseKey 來完成的。
原文轉自:http://www.kjueaiud.com