2009-12-26 64 views
-3

我已經在C#Windows窗體中構建了一個程序,現在在第一次加載時嘗試創建計劃任務。如果它引發異常,並且它在主計算機上,那麼這是軟件首次加載(您可以在多臺計算機上安裝該程序,但一臺計算機是計劃任務的主要計算機)。 (XP-SP1/2,Vista-SP1/2,Win7),現在當我嘗試在有限的用戶上安裝它時(在Win XP Pro SP2上)它會嘗試創建計劃任務。我得到一個參數空引用,當我輸入管理員用戶時,它將安裝在管理員用戶的計劃任務,並且如果有限的用戶登錄(99.9%的時間)將不會運行。爲什麼我得到這個例外?我找了幾個小時尋找這個異常的原因,但我找不到它!無法在Win XP中添加計劃任務,限制用戶

非常感謝!

阿米特

MainOrSec = true; 

用戶和通行證是公共變量whice從FirstTimeUp回報。

private bool CreateNoExit() 
     { 
      try 
      { 
       RegistryKey key = Registry.CurrentUser; 
       key = key.OpenSubKey("Crm"); 
       MainOrSec = Convert.ToBoolean(AESIMP.Decrypt((string)key.GetValue(AESIMP.Encrypt("MorS")))); 
      } 
      catch (ArgumentNullException) 
      { 
       MainOrSec = true; 
      } 
      if (MainOrSec) 
      { 
       ScheduledTasks sc = new ScheduledTasks(); 
       Task task; 
       try 
       { 
        task = sc.CreateTask("NoExit"); 
        FirstTimeUp f = new FirstTimeUp(this); 
        f.ShowDialog(); 
       } 
       catch (ArgumentException) 
       { 
        return false; 
       } 
       if (!CreatT) 
        return false; 
       task.ApplicationName = @"C:\Program Files\Triffon\Crm Setup 
2.0.0002\noexit.exe"; 
       task.Comment = "Check For no exit on the database."; 
       task.SetAccountInformation(User, Pass); 
       task.IdleWaitMinutes = 10; 
       task.Triggers.Add(new DailyTrigger(5, 0)); 
       try 
       { 
        task.Save(); 
        task.Close(); 
        sc.Dispose(); 
       } 
       catch (COMException ex) 
       { 
        MessageBox.Show(ex.Message); 
        return false; 
       } 
       return true; 
      } 
      return false; 
     } 
+1

我們可以看到一些代碼嗎? – 2009-12-26 23:06:25

+0

因爲我告訴過你它在每個系統上工作,但這個有限的用戶條件,雖然你不需要這樣做 - 因爲我有一個權限問題或一些代碼,我錯過了處理權限。我將編輯問題並添加代碼。 – Mazki516 2009-12-26 23:15:04

+1

哪一行代碼會觸發異常?對於獎勵積分,打印該行中使用的每個變量的值,或使用調試器檢查它們。你可能會發現你試圖解引用null。 – 2009-12-26 23:24:29

回答

4

OK ,所以如果你得到一個異常,最好的辦法是在Visual Studio的調試器下運行你的程序,這樣你就可以看到異常的確切位置。在這裏,Ctrl-Alt-E是你的朋友:打開「公共語言運行時例外」旁邊的「Thrown」列中的複選框,無論發生什麼情況,都會跳到調試器。

如果您在沒有Visual Studio的用戶計算機上測試您的應用程序,那麼您還有其他選擇。其中一個(如果您使用Pro或更高版本)則在遠程PC上運行Remote Debugger。然後,您可以附加到正在運行的程序並查看異常。

如果您沒有Pro或不能輕鬆使用遠程調試器,那麼絕對值得使用像log4net這樣體面的日誌框架來確保所有異常都被捕獲,捕獲並寫入日誌文件。坦率地說,直到完成這個任務後才能發佈生產應用程序。

完成此操作後,請仔細查看異常跟蹤以查看引起問題的位置。我願意打賭,ScheduledTasks類拋出一個異常,你不期望的地方。

最後,你會得到積極報酬,因爲這裏的文化是「如果你讓我們知道我們需要知道的一切幫助,我們將會提供幫助。」關於整個堆棧跟蹤的評論中有幾個請求沒有出現,所以這裏的人們恐怕會認爲這種粗魯。

+0

你是對的,並不意味着這樣的聲音,但你真的需要看到我坐在座位上寫這個softwere到一個buissnes,然後我得到這個例外,其中有30臺電腦與有限的用戶...最後我找到了一個解決方案,你用管理員用戶名和密碼安裝任務,然後給這些任務的NTFS權限......它解決了它...花了我幾個小時來寫這些nfts的權限,但在租約它的工作:)感謝有關遠程調試器的信息。從來沒有聽說過!謝謝! – Mazki516 2009-12-29 20:20:55

4

如果沒有堆棧跟蹤,很難弄清楚,但存在可疑的代碼行。

根據MSDN RegistryKey.GetValue()回報:

如果找不到名稱與name關聯的值,或 空引用(在Visual 基本沒有)。

在這裏,你直接傳遞函數的結果給另一個函數:

MainOrSec = Convert.ToBoolean(AESIMP.Decrypt((string)key.GetValue(AESIMP.Encrypt("MorS")))); 

嘗試調用它,而不是幾個步驟,檢查空在需要的地方:

string s = key.GetValue(AESIMP.Encrypt("MorS")) as string; 
if(!string.IsNullOrEmpty(s)) 
    MainOrSec = Convert.ToBoolean(AESIMP.Decrypt(s)); 
else 
    MainOrSec = true; 
+0

謝謝。但爲什麼我把它放在「try-catch」中,在第一次加載時它會觸發null異常,然後進入程序的配置管理器,我解決了下次加載時的異常......問題更多地是關於權限,但是謝謝你試圖幫助我 – Mazki516 2009-12-27 01:00:56