2010-09-06 86 views
1

我有一個讀取註冊表項字符串值的小應用程序。它運作良好,但由於某些原因,在這個關鍵的失敗: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProductId 儘管其它值工作HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\無法以編程方式讀取某些註冊表項

它也不能在'HKEY_LOCAL_MACHINE \ SOFTWARE \微軟\加密\ MachineGuid」

我正在爲一個管理員,這是一個因素嗎?我正在運行W7 64bit,另一臺W7機器和Vista機器都正常工作。我唯一的猜測是一些許可問題,或與我有關的運行64位。

任何想法?

更新: 這似乎與我的系統運行Windows 64位和\Software\Wow6432Node\有關。我不知道。我都\Software\Wow6432Node\Microsoft\Windows NT\CurrentVersion\\Software\Microsoft\Windows NT\CurrentVersion\但只有後者包含的ProductID值...由於某種原因,當我問關鍵的Windows顯然看在Wow6432Node

我們使用wxWidgets的,但很可能,如果直接使用一些代碼的Win32需要...我們的應用程序是一個32位應用程序,但目標個人電腦可以運行32或64位版本的Windows

+1

如果您沒有向我們展示代碼,我們無法幫助您。你看過ACL嗎?它不一定授予您正在運行的特定管理員用戶。你得到什麼錯誤代碼? – bmargulies 2010-09-06 17:31:42

+0

它是wxWindows中的包裝代碼...您只需傳入關鍵路徑以及其它所有工作。 – 2010-09-06 17:35:46

+0

你可以擴大'它失敗'?當然有一個錯誤代碼返回,你能告訴我們它是什麼嗎? – James 2010-09-06 18:40:41

回答

0

我只是看着我的註冊表,並沒有在HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ ProductId或MachineGuid,這是在Win7 64位

+0

當我運行註冊表編輯器時,我在'SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \'中看到ProductId,但看不到'SOFTWARE \ Wow6432Node \ Microsoft \ Windows NT \ CurrentVersion \'。我可以強制regedit在32/64位模式下工作嗎? – 2010-09-06 18:56:38

+1

這是一個瘋狂的晚評,但你可以。對於64位註冊表訪問使用「regedit」,對於32位註冊表訪問使用「regedt32」。僅適用於64位窗口。 – Wug 2012-08-06 16:08:50

0

我得到了以下代碼在32位XP機器和64位Win 7機器上工作。我認爲這應該涵蓋大部分基地。

// start out trying to read machine guid on 32 bit machine 
object value = Registry.GetValue(@"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography", @"MachineGuid", (object) "defaultValue"); 

if (value != null && value.ToString() != "defaultValue") 
{ 
    return value.ToString(); 
} 

// read machine guid on 64 bit machine 
RegistryKey regKeyBase = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64); 
RegistryKey regKey = regKeyBase.OpenSubKey(@"SOFTWARE\Microsoft\Cryptography", RegistryKeyPermissionCheck.ReadSubTree); 
value = regKey.GetValue("MachineGuid", (object) "defaultValue"); 

regKeyBase.Close(); 
regKey.Close(); 

if (value != null && value.ToString() != "defaultValue") 
{ 
    return value.ToString(); 
} 

return string.Empty;