2009-12-26 65 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