【问题标题】:Can't add Schedule task in Win XP, limited user无法在 Win XP 中添加计划任务,受限用户
【发布时间】:2010-12-30 04:35:25
【问题描述】:

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

我已经在许多计算机上尝试过这个程序并且它运行良好(XP-SP1/2、Vista-SP1/2、Win7),现在当我尝试将它安装在受限用户上时(在 Win XP Pro SP2 上)它尝试创建计划任务。我得到一个 Argument Null Reference,当我输入管理员用户时,它会在管理员用户上安装计划任务,并且如果受限用户登录(这是 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;
        }

【问题讨论】:

  • 因为我告诉过你它适用于每个系统,但这种有限的用户条件虽然你不需要 - 因为我有权限问题或我错过了处理权限的一些代码。我将编辑问题并添加代码。
  • 哪行代码触发了异常?对于奖励积分,打印该行中使用的每个变量的值,或使用调试器检查它们。您可能会发现您正在尝试取消对 null 的引用。
  • 那是什么让我生气!使用消息框将代码“try-catch”放在整个代码中,并且此代码或其使用的其他类中没有函数,引发此异常
  • 您问题的标题与问题无关。该代码不管理计划任务,您只是有一段代码在某些用户上下文中不起作用。
  • 您的代码正在触发异常。仅仅因为它不是在每台计算机上都发生并不会降低这一点。发布异常的堆栈跟踪,也许我们可以为您提供帮助。放下态度。

标签: c# scheduled-tasks


【解决方案1】:

没有堆栈跟踪很难弄清楚这一点,但是有一行可疑的代码。

根据 MSDN RegistryKey.GetValue() 返回:

与名称关联的值,或 空引用(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;

【讨论】:

  • 谢谢。但这就是为什么我把它放在“try-catch”中,第一次加载它会触发空异常,然后它进入程序的配置管理器,在那里我解决了下一次加载的异常......问题更多是关于权限但是感谢您尝试帮助我
【解决方案2】:

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

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

如果您没有 Pro,或者不能轻松使用远程调试器,那么绝对值得使用像 log4net 这样的体面的日志框架,以确保捕获、捕获所有异常并将其写入日志文件。坦率地说,在完成此操作之前不应发布任何生产应用程序。

完成此操作后,请仔细查看异常跟踪,了解问题出在何处。我敢打赌,ScheduledTasks 类会在您意想不到的地方抛出异常。

最后,你会被否决,因为这里的文化是“如果你让我们知道我们需要知道的一切来提供帮助,我们就会提供帮助。” cmets 中有几个要求完整堆栈跟踪的请求,但尚未出现,所以这里的人会认为这很粗鲁,恐怕。

【讨论】:

  • 你是对的,不是故意的,但你真的需要看到我坐在座位上写这个软件到一个企业,然后我得到这个例外,他们有 30 台计算机受限用户...最后我找到了一个解决方案,您使用管理员用户名和密码安装任务,然后为这些任务授予 ntfs 权限...它已经解决了...花了我几个小时来编写这些 nfts 权限,但至少它正在工作:) 感谢您提供有关远程调试器的信息。从来没有听说过!谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-04
  • 2021-04-21
  • 2012-04-27
  • 1970-01-01
  • 1970-01-01
  • 2012-05-28
  • 2016-10-30
相关资源
最近更新 更多