2011-09-09 49 views
0

我在.Net中編寫了一個包裝應用程序,該應用程序使用指定的用戶名和密碼啓動另一個WinForms應用程序。對於背後的原因,我需要做此背景下,你可以看看下面的問題,我在本週早些時候發佈:奇怪的問題。使用Process.Start啓動的應用程序在寫入Windows註冊表時發出UnauthorizedAccessException

How to secure a network folder containing an Access database, while still allowing a WinForms application to connect to the database

下面是包裝應用的代碼:

string sysFolder = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().CodeBase); 
ProcessStartInfo pInfo = new ProcessStartInfo(); 
pInfo.FileName = (sysFolder + @"\AppMain.exe").Replace(@"file:\", @"\\"); 
pInfo.UserName = GetUserName(); 
pInfo.Password = ToSecure(GetPassword()); 
pInfo.UseShellExecute = false; 
Process p = Process.Start(pInfo); 
p.WaitForExit(); 

方法GetUserName()GetPassword()只是從加密的文本文件中檢索用戶名和密碼。方法ToSecure()只是將字符串轉換爲System.Security.SecureString

好的。現在這裏是怪異的部分! :)這個包裝應用程序實際上正常工作MOST的時間;但出於某種奇怪的原因,它似乎在系統重啓後立即出現問題。重新啓動後,大約5分鐘後,正在啓動的應用程序(AppMain.exe)在應用程序嘗試寫入Windows註冊表時引發UnauthorizedAccessException。我不知道爲什麼這隻在前5分鐘出錯,然後突然開始正常工作。

還要注意,我必須關閉該應用程序,並在啓動五分鐘後重新啓動,以使其正常工作。如果我只是在期待中按「繼續」,它會在試圖寫入註冊表時繼續執行該命令。

下面是在重新啓動後啓動應用程序時會拋出異常的代碼。

Microsoft.VisualBasic.Interaction.SaveSetting("app", "settings", "time", DateTime.Now.ToString()); 

我已確認在XP和Windows 7的任何人有任何想法,爲什麼這是在啓動時發生,爲什麼突然異常消失,如果我推出5分鐘後開機後應用此行爲。

+0

使用Taskmgr.exe,進程選項卡並開始查殺進程,直到找到干擾應用程序的進程。從您的反惡意軟件開始。 –

+0

@Hans Passant我非常懷疑這是另一個進程干擾我的應用程序的結果,因爲我可以在三臺不同的計算機上重現相同的行爲,包括Windows XP的_fresh_安裝。 – BruceHill

+0

嗯,只需要5分鐘。我們會更多地瞭解。祝你好運。 –

回答

0

我終於發現是什麼導致了這個問題。我找到了答案在這裏:

http://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo.loaduserprofile.aspx

ProcessStartInfo.LoadUserProfile是缺少一塊拼圖。在過程信息對象中,有一個屬性LoadUserProfile它指示是否必須加載用戶的配置文件,並且此屬性的默認值爲false。但是,如果您調用的進程需要訪問HKEY_CURRENT_USER,因爲我的調用進程正在嘗試執行此操作,則此屬性必須設置爲true

所以一旦我設定LoadUserProfile真正PINFO然後我的應用程序的工作100%,甚至重新啓動後直接。

0

我會建議你嘗試使用模擬。如果您在模擬的上下文中運行這段代碼,是否會發生此錯誤?

+0

謝謝,javros。我會測試模擬,並讓你知道這是否有幫助。 – BruceHill

+0

我將模擬添加到正在啓動的應用程序中,但沒有任何區別;寫入註冊表時,仍會發生異常。我還注意到,模擬前後的上下文是相同的,這是有道理的,因爲應用程序是用相同的用戶名和密碼啓動的。 – BruceHill

相關問題