none
使用管理员权限会引发异常? RRS feed

  • 问题

  • 我写了一个小程序,启动时会加载一个xml当作配置。

    我用的Vista,一般情况这个程序都可以正常执行,一旦使用管理员权限启动就会崩溃,然后Windows错误报告分析System.IO.DirectoryNotFound。

    补充一下,刚才又测试了,这种情况只有在系统目录才会出现...

    百试不爽,难道某些方面管理员权限会比用户权限更受限?...

    求解答。

    2010年7月9日 20:35

答案

  • 顺便说,我根据我的推测把代码改成这样,现在可以两种权限没有区别的执行了。

    string ConfigSrc = Application.ExecutablePath + MyDataFile
    XmlDocument xmldoc = new XmlDocument();
    xmldoc.Load(ConfigSrc);

    自己总结一下,应该是在以下两种环境下出现了两种权限执行结果不一致的情况:

    1.路径不全,系统自动补齐,补齐方法不明,结果不一致
    2.路径用Environment的成员去构成,系统分配某些成员的值的方法不明,结果不一致

    • 已标记为答案 sartrey 2010年7月12日 2:06
    2010年7月11日 10:03
  • 你好!

         问题的确是这样的:

          这里很容易引发潜在的Bug,在C:\Windows下,以管理员身份运行程序,Environment.CurrentDirectory为C:\Windows\System32,而不是C:\Windows.

         我认为这里是一处Bug,已经上报给微软了。


    周雪峰
    • 已标记为答案 sartrey 2010年7月12日 2:06
    2010年7月11日 11:56
    版主

全部回复

  • 这是VISTA的一种安全机制,Vista为了确保安全,即使管理员也不能完成所有的一切操作,

    你可以通过右键菜单中的操作来设置文件或文件夹来提升权限。

    参照:

    http://blog.csdn.net/jonvee/archive/2010/03/22/5404304.aspx


    .net/asp.net开发群118343907
    2010年7月10日 1:05
  • 你好!

         你把你程序里的Try...catch先去掉,然后调试,看看是哪个目录没有找到儿抛出的异常。


    周雪峰
    2010年7月10日 4:43
    版主
  • 我的情况应该还要奇怪一点,用普通用户权限就可以。

    我尝试用File.Exists()测试Explorer的情况,结果普通用户权限就可以发现Explorer,管理员权限则不可以...

    2010年7月10日 7:22
  • 你好!

       请问可以提供相关的代码吗?


    周雪峰
    2010年7月10日 9:15
    版主
  • public static Dictionary<string, string> Load(string Source)
    {
     Dictionary<string, string> InfoList = new Dictionary<string, string>();
     XmlDocument xmldoc = new XmlDocument();
     MessageBox.Show("是否找到Explorer:" + File.Exists("explorer.exe").ToString());
     try
     {
      xmldoc.Load(Source);
      XmlNodeList xnl = xmldoc.SelectSingleNode("root").ChildNodes;
      foreach (XmlNode xn in xnl)
      {
       XmlElement xe = (XmlElement)xn;
       InfoList.Add(xe.GetAttribute("type"), xn.InnerText);
      }
     }
     catch
     {
      Application.Exit();
     }
     return InfoList;
    }
    
    
    2010年7月10日 12:18
  • 就是这么一段简单的加载xml的代码,没做任何特殊处理。

    经过更加仔细的测试,得出以下线索:

    使用普通用户权限时不会出现任何异常,只要文件存在。

    使用管理员权限运行时,只要程序和需要加载的文件不同时存在于C:\Windows就可以正常运行。
    一旦两者都在C:\Windows就一定会崩溃。

    2010年7月10日 12:28
  • 你好!

         你这样测试:

    MessageBox.Show("是否找到Explorer:" + File.Exists(@"C:\Windows\explorer.exe").ToString());

       是否以管理员身份运行,都可以发现explorer.


    周雪峰
    2010年7月11日 1:56
    版主
  • 你好!

         我做了如下测试:

         XmlDocument xmldoc = new XmlDocument();


         xmldoc.Load(@"C:\Windows\Starter.xml");

     

         Start.xml和程序都放在C:\Windows,然后管理员身份运行程序,并没有抛出异常。所以还是建议检查你的代码,看看路径是否真的存在。


    周雪峰
    2010年7月11日 1:58
    版主
  • 我又进行了你改过的Explorer.exe的测试,发现确实如你所说。
    所以我怀疑管理员权限的全路径有所不同。

    为此我又进行了如下测试:

                string ConfigSrc = Environment.CurrentDirectory + MyDataFile;
                MessageBox.Show(ConfigSrc);

    将编译后的程序和数据文件复制到C:\Windows下,用两种权限分别测试,发现了奇怪的结果。

    普通用户权限弹出的消息框:C:\Windows\MyDataFile

    管理员权限弹出的消息框:C:\Windows\system32\MyDataFile

    我怀疑是这个问题导致的上述现象,但不知道原因,请再帮我测试一下。

    2010年7月11日 9:56
  • 顺便说,我根据我的推测把代码改成这样,现在可以两种权限没有区别的执行了。

    string ConfigSrc = Application.ExecutablePath + MyDataFile
    XmlDocument xmldoc = new XmlDocument();
    xmldoc.Load(ConfigSrc);

    自己总结一下,应该是在以下两种环境下出现了两种权限执行结果不一致的情况:

    1.路径不全,系统自动补齐,补齐方法不明,结果不一致
    2.路径用Environment的成员去构成,系统分配某些成员的值的方法不明,结果不一致

    • 已标记为答案 sartrey 2010年7月12日 2:06
    2010年7月11日 10:03
  • 你好!

         问题的确是这样的:

          这里很容易引发潜在的Bug,在C:\Windows下,以管理员身份运行程序,Environment.CurrentDirectory为C:\Windows\System32,而不是C:\Windows.

         我认为这里是一处Bug,已经上报给微软了。


    周雪峰
    • 已标记为答案 sartrey 2010年7月12日 2:06
    2010年7月11日 11:56
    版主
  • 这不是微软的bug……使用依赖于Environment.CurrentDirectory的相对路径的代码才是bug,因为当前目录是不确定的,比如快捷方式里面可以更改工作目录,运行过文件打开对话框之后当前目录变成打开的目录等等。比较准确的方法是像上面那样用绝对路径打开文件。

    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP
    • 已建议为答案 mazhou 2010年7月12日 7:06
    2010年7月12日 4:03
    版主
  • 蒋版主,你好!

          请教一下这个问题啊。

          对Environment.CurrentDirectory这个属性,我还是有疑问的,文档中是这样描述这个属性的:

          获取和设置当前目录(即该进程从中启动的目录)的完全限定路径。

    http://msdn.microsoft.com/zh-cn/library/system.environment.currentdirectory%28VS.80%29.aspx

          既然进程是从C:\Windows目录启动的,那这个属性的值就应该是C:\Windows.

     

          我认为这种方法,才是你描述的的那种效果:

    System.IO.Directory.GetCurrentDirectory()


    周雪峰
    2010年7月12日 5:57
    版主
  • 蒋版主,你好!

          请教一下这个问题啊。

          对Environment.CurrentDirectory这个属性,我还是有疑问的,文档中是这样描述这个属性的:

          获取和设置当前目录(即该进程从中启动的目录)的完全限定路径。

    http://msdn.microsoft.com/zh-cn/library/system.environment.currentdirectory%28VS.80%29.aspx

          既然进程是从C:\Windows目录启动的,那这个属性的值就应该是C:\Windows.

     

          我认为这种方法,才是你描述的的那种效果:

    System.IO.Directory.GetCurrentDirectory()


    周雪峰


    这个不是 Bug。当前进程的启动位置不一定就是进程可执行文件存放的位置。举个例子,在 Windows 7 中,文件系统存在软连接或硬连接,软连接 (Soft Link) 是可以将同一个 EXE 文件链接到不同的存储位置的,如 Bcdedit.exe。另外,以管理员身份运行的进程,其启动目录为 %SystemRoot%\System32 而不是 %SystemRoot%。


    Mark Zhou
    2010年7月12日 7:06
  • 你好!

         十分感谢啊!

        但是“以管理员身份运行的进程,其启动目录为 %SystemRoot%\System32 而不是 %SystemRoot%。”

        我把程序拷贝到其他目录下,无论程序是否以管理员身份启动,Environment.CurrentDirectory获取的都是应用程序所存储的目录。

         只有C:\Windows目录下特殊吗?


    周雪峰
    2010年7月12日 7:44
    版主