2010-08-02 34 views
3

我创建了一个.bat文件,该文件显示服务器终端服务会话标识和用户名。 林显示信息在DataGridc#.net错误循环使用枚举器

这里是.bat文件的输出:

 
C:\Documents and Settings\adcock>qwinsta /server:ilsap01 
SESSIONNAME  USERNAME     ID STATE TYPE  DEVICE 
console          0 Conn wdcon 
rdp-tcp         65536 Listen rdpwd 
        Jrodriguez    27 Disc rdpwd 
        pbahena     8 Disc rdpwd 
        tfurr      3 Disc rdpwd 
rdp-tcp#2187  kchild     14 Active rdpwd 
        Trhodes     10 Disc rdpwd 
        ajordan     16 Disc rdpwd 
        Trhodes     11 Disc rdpwd 
rdp-tcp#2191  rluna     15 Active rdpwd 
rdp-tcp#2192  lcathey     17 Active rdpwd 

我要显示的唯一信息是会话ID和用户名与代码有些作品下面。

protected void Button1_Click(object sender, EventArgs e) 
{ 
    System.Diagnostics.ProcessStartInfo psi = new  System.Diagnostics.ProcessStartInfo(@"C:\listfiles.bat"); 
    psi.RedirectStandardOutput = true; 
    psi.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; 
    psi.UseShellExecute = false; 
    System.Diagnostics.Process listFiles; 
    listFiles = System.Diagnostics.Process.Start(psi); 
    System.IO.StreamReader rawUserData = listFiles.StandardOutput; 
    listFiles.WaitForExit(30000); 
    try 
    { 

     DataTable table2 = new DataTable(); 
     table2.Columns.Add(new DataColumn("UserName", typeof(string))); 
     table2.Columns.Add(new DataColumn("SessionId", typeof(string))); 

     String myString = rawUserData.ReadToEnd(); 
     string exp = @"([\w_]+)"; ; 


     MatchCollection matches = Regex.Matches(myString, exp,RegexOptions.IgnoreCase); 

     IEnumerator en = matches.GetEnumerator(); 

     while (en.MoveNext()) 
     { 
      Match match = (Match)en.Current; 

      if (en.Current.ToString() == "rdpwd") 
      { 
       en.MoveNext(); 

       Match match_Item = (Match)en.Current; 

       string item = match_Item.Value; 

       en.MoveNext(); 

       Match match_Item2 = (Match)en.Current; 

       string item2 = match_Item2.Value; 

       DataRow row = table2.NewRow(); 
       row[0] = item.Split()[0]; 
       row[1] = item2.Split()[0]; 
       //row[1] = item.Split(',')[1]; 
       table2.Rows.Add(row); 

       //en.MoveNext(); 
       //break; 

      } 


     } 

     this.displayUsers.DataSource = table2; 
     this.displayUsers.DataBind(); 
    } 

    catch (Exception ex) 
    { 
     Response.Write(ex); 
    } 

我的错误是: 枚举有或者没有启动或已完成。

我设置了一个断点,并且它接受while循环完成但重新开始,并且在它添加一对重复记录之后,它会引发错误。任何想法是什么造成这一点。我在想我的RegEx

+1

每次检查if(en.MoveNext()) – garik 2010-08-02 13:27:55

+1

为什么在调试过程中不打印每个匹配?你确定你可以在不检查是否有更多匹配的情况下移动下一个文本吗? – jgauffin 2010-08-02 13:31:13

+1

我很想知道.bat文件代码的外观。也许另一种方法是使用WMI来获取终端服务SessionID,而不是使用.bat文件和System.Diagnostics.ProcessStartInfo。请参阅:http://msdn.microsoft.com/en-us/library/aa383637(VS.85).aspx – Riaan 2010-08-02 13:54:11

回答

2

你在循环内调用MoveNext两次。这是造成这个问题的原因。

当你在最后一行,你调用MoveNext,它找到“rdpwd”,然后它调用MoveNext一次,然后再次调用它,这是当枚举器变为无效。 然后在最后一个MoveNext中断,因为它已经结束了。