无法在Win XP中限制用户添加计划任务

时间:2009-12-26 22:55:56

标签: c# scheduled-tasks

我已经在C#Windows窗体中构建了一个程序,现在在第一次加载时尝试创建计划任务。如果它引发异常并且它在主计算机中,则这是第一次加载软件(您可以在许多计算机上安装此程序,但一台计算机是计划任务的主要部分)。

我在很多计算机上尝试过这个程序,它完美运行(XP-SP1 / 2,Vista-SP1 / 2,Win7),现在当我尝试在有限的用户上安装它时(在Win XP Pro SP2上)它尝试创建计划任务。我得到一个参数空引用,当我进入管理员用户时,它会在管理员用户上安装计划任务,如果有限用户登录则不会运行(这是99.9%的时间)。为什么我得到这个例外?我在代码上搜索了几个小时,搜索了这个异常的原因,但我找不到了!

非常感谢!

阿米特

MainOrSec = true;

User和Pass是从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;
        }

2 个答案:

答案 0 :(得分:4)

如果没有堆栈跟踪很难解决这个问题,但是存在可疑的代码行。

根据MSDN RegistryKey.GetValue()返回:

  

与name或a关联的值   null引用(Visual中没有任何内容   基本)如果找不到名字。

在这里,您将该函数的结果直接传递给另一个函数:

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

尝试通过几个步骤调用它,在需要的地方检查null:

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

答案 1 :(得分:4)

好的,所以如果你遇到异常,最好的办法是在Visual Studio的调试器下运行你的程序,这样你就可以确切地看到调用异常的位置。在这里, Ctrl-Alt-E 是你的朋友:打开“Common Language Runtime Exceptions”旁边的“Thrown”列中的复选框,无论如何你都会打破调试器。

如果您在没有Visual Studio的用户计算机上测试应用程序,那么您还有其他选择。一个(如果你使用Pro及以上)是在远程PC上运行Remote Debugger。然后,您可以附加到正在运行的程序并查看异常。

如果您没有Pro,或者无法轻松使用远程调试器,那么绝对值得使用像log4net这样的合适的日志记录框架来确保捕获,捕获和写入所有异常到日志文件。坦率地说,在完成之前不应该发布生产应用程序。

完成此操作后,请仔细查看异常跟踪以查看问题的原因。我愿意打赌,ScheduledTasks类正在某个你不期望的地方抛出异常。

最后,你会得到一些投票,因为这里的文化是“如果你告诉我们需要知道的一切来帮助我们,我们会帮助你。”在评论中有一些请求没有出现完整的堆栈跟踪,所以这里的人会认为这很粗鲁,我很害怕。