本帖最后由 lulianqi 于 2010-06-08 12:27:40 编辑

解决方案 »

  1.   


      //给Process对象设置了几个属性,问题解决
                Process process = new Process();
                process.StartInfo.FileName = strPlayerPath;
                process.StartInfo.Arguments = "";
                process.StartInfo.WorkingDirectory = "";
                process.StartInfo.UseShellExecute = false;
                process.StartInfo.RedirectStandardInput = true;
                process.StartInfo.RedirectStandardOutput = true;
                process.StartInfo.RedirectStandardError = true;
                process.StartInfo.ErrorDialog = false;
                process.StartInfo.CreateNoWindow = true;
                process.Start();
                process.Close();
      

  2.   

    很高兴你能问这个问题
    看下这个也许能明白点什么:http://www.cnblogs.com/eGaoYang/archive/2009/09/21/1570951.html
      

  3.   

    在web.config文件添加: 
    <identity     impersonate=true   userName= "Administrator "   password= "你机器的管理人密码 "/> 
      

  4.   

    最近在写一个Online Judge的系统,里面用到Process类。Process类有一个Exited事件,看看MSDN的解释:Exited 事件指示关联进程已退出。发生这种情况表示进程终止(已中止)或成功关闭。仅当 EnableRaisingEvents 属性的值为 true 时才发生此事件。
    这又涉及到EnableRaisingEvents这个属性,MSDN的意思是,只有值为True,才会触发Exited事件,否则即使程序退出,也不会触发Exited事件。 可是我写了如下程序,还是触发了Exited事件隐藏行号 复制代码 ? 这是一段程序代码。 
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Diagnostics;
    namespace Test
    {
        class Program
        {
            public static void Main()
            {
                Process p = new Process();
                p.StartInfo.FileName = "return0.exe";
                p.EnableRaisingEvents = false;
                p.Exited += new EventHandler(Process_Exited);
                p.Start();
                p.WaitForExit(1000 * 5);
                if (p.HasExited == false) p.Kill();
                for (int i = 0; i < 10000000; i++)
                {
                    int pp = i;
                }
            }
            private static void Process_Exited(object sender, EventArgs e)
            {
                Console.WriteLine("触发Exited事件");
            }
        }
    }运行结果: 
    还是触发了Exited事件……对于这个问题,研究了好久,根据程序自动退出/操作系统关闭程序/process.kill结束程序三种情况,做了多次实验发现…EnableRaisingEvents为False时,程序结束的确不会触发Exited事件…但是一旦访问HasExited属性,如果Exited事件没有触发过,那么将会触发一次Exited事件
      

  5.   

    http://blog.sina.com.cn/s/blog_4c6e822d0100ibm7.html
    这里有个类似的
      

  6.   

         这里的进程是我获取的系统进程,不是我自己启动的所以
    “如果未使用 Start 方法启动进程,则 StartInfo 属性不会反映启动该进程时使用的参数。例如,如果使用 GetProcesses 获取计算机上运行的进程的数组,则每个 Process 的 StartInfo 属性将不包含启动进程时使用的原始文件名称或参数。”我只好是用GetProcesses()  获取的,
    补充一下  不是所有的进程都会出错(比如qq.exe就不会出错)   只是一些系统进程无法访问
        而我想获取这些进程现在是否正在运行。
           十分感谢您的回答
      

  7.   

    修正下  “我正好是用GetProcesses() 获取的”
      

  8.   

    补充一下 不是所有的进程都会出错(比如qq.exe就不会出错) 只是一些系统进程无法访问
      而我想获取这些进程现在是否正在运行。

        我是楼主(同一账户只能发3次,所有又去注册了个马甲)
      

  9.   

         不是 asp.net 才有 web.config的吗?
          我是使用app.manifest来提供管理员身份的
    同样感谢您的回复
    我是楼主(同一账户只能发3次,所有又去注册了个马甲)
      

  10.   

    我看了MSDN文档,访问该属性出错时,有这种异常抛出:
    InvalidOperationException 没有与该对象关联的进程。
     所以我觉得是你的这个process的句柄已经被回收了,也就是说,你原来获取的某个进程,已经不存在了!所以你要try
    {
        Mypcs = Process.GetProcesses();
     lijie = Mypcs[comboBox1.SelectedIndex];
     if (lijie.HasExited)
    }
    catch(InvalidOperationException)
    {
       ....
    }
      

  11.   

    出错的进程 mainwindowhandle 都为0
    不过 procename 的值都是存在的 如 “csrss”
    而且 workingset64 的值也是有的 所以我觉得 lijie这个进程不为null 不知道这样想对不对
      不然 我真的只能try catch 了 不过只要一catch 程序就会卡一会 很是不爽  
           大家都来帮帮我吧    我头都大了
          
      

  12.   

    谢谢您了 现在我又学到了更多。。向您,还有回我贴的这些朋友
      以前我以为重新刷新,会耗资源,所有在程序中很少刷新。
      今天受大家指点,在自己电脑上实践了一番。。代码如下
    public Process lijie;
            public Process[] mypro;
            int i = 1;
            public bool temp = false;
            private void getprocess_Load(object sender, EventArgs e)
            {
                textBox1.Text = "1";
            }        private void button1_Click(object sender, EventArgs e)
            {
                i=int.Parse(textBox1.Text);
                label1.Text = DateTime.Now.Second.ToString() + ":" + DateTime.Now.Millisecond.ToString();
                for(int k=1;k<=i;k++)
                {
                    mypro = Process.GetProcesses();
                    foreach (Process xx in mypro)
                    {
                        if (xx.ProcessName == "mytest")
                        {
                            temp = true;
                            break;
                        }
                    }
                }
                label2.Text=DateTime.Now.Second.ToString()+":"+DateTime.Now.Millisecond.ToString();
            }      我发现在如果我刷新一次 用的时间最多为5毫秒,最少是0(比较不出来差距了,在毫秒级别) 而且刷新是越来越迅速的 随着次数的增加 时间有减少的趋势 即使我把次数设置为 10000次 也只用了 10秒
      使以这样遍历一遍 会比所有try catch 好 因为只要一catch 往往程序就会卡2秒左右(可以供我刷新2000次了)
      再次感谢大家  谢谢大家对我的帮助    
      我会努力的呵呵
      

  13.   

    根据堆栈信息,我提两点建议
    1. 本地进程的权限需要提升,具体可以使用Advapi32.dll中的OpenProcessToken提升为  TOKEN_ADJUST_PRIVILEGES
       具体请参考msdn中OpenProcessToken()
    2. 有些安全工具会HOOK OpenProcess或者截获内核中的NTOpenProcess,让某些进程无法获得进程句柄,如360保险箱等,需要找相应的工具进行检查