我创建了一个.bat文件,该文件显示服务器终端的Service SessionID和Username。
我在数据网格中显示信息

这是.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

the only information i want to display is the SessionID and Username that works somewhat with the code below.

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循环完成但重新开始的过程,并在它添加了几个重复的记录之后引发了错误。关于什么原因的任何想法。我在想我的正则表达式

最佳答案

您在循环内两次调用MoveNext。那就是问题所在。

当您在最后一行时,调用MoveNext,它将找到“ rdpwd”,然后调用MoveNext一次,然后再次调用它,这是枚举数变为无效的时间。
在此之后的最后一个MoveNext中断了,因为它已经在结尾了。

09-25 15:48