tags:

views:

268

answers:

2

I would like to know how to retrieve the list of users that are logged onto a Remote machine. I can do it with qwinsta /server:xxxx, but would like to do it in C#.

+1  A: 

check out wmi in .net under system.management.

something like:

ConnectionOptions conn = new ConnectionOptions(); conn.Authority = "ntdlmdomain:NAMEOFDOMAIN"; conn.Username = ""; conn.Password = "";

ManagementScope ms = new ManagementScope(@"\remotecomputer\root\cimv2", conn); ms.Connect();

ObjectQuery qry = new ObjectQuery("select * from Win32_ComputerSystem");

ManagementObjectSearcher search = new ManagementObjectSearcher(ms, qry);

ManagementObjectCollection return = search.Get();

foreach (ManagementObject rec in return) { Console.WriteLine("Logged in user: " + rec["UserName"].ToString()); }

You may not need the ConnectionOptions...

klabranche
Right, I believe it is the WMI_LogonSession - Do you have any helpful examples anywhere?
This code does work but it doesn't seem to work when you are not logged on to the computer. I have 8 Servers that I am the admin of, and I want to get the list remotely of all the users that are logged on. Do you think I need to use the Win32_LogonSession query, and if so do you know how to use it. This is my first time working with WMI.
I'm not sure... See if this helps:http://stackoverflow.com/questions/898757/vb-using-wmi-get-logged-in-users
klabranche
A: 

I ended up using the qwinsta /server:server1 command from C# -- it was much easier

thanks Ken

All this checks all 8 servers at the same time -- I put the result in sql server

but you can do what ever you want

query_citrix.bat script cd C:.......\bin\citrix_boxes qwinsta -server:servername or ip > servername.txt


string sAppCitrixPath = Application.StartupPath.ToString() + "\citrix_boxes\";

//Run Script for current citrix boxes Process proc = new Process(); ProcessStartInfo si = new ProcessStartInfo(); si.FileName = sAppCitrixPath + "query_citrix.bat"; proc.StartInfo = si; proc.Start(); proc.WaitForExit(); int exitCode = proc.ExitCode; proc.Close();

if (exitCode == 0) { //Execute update who is on the Citrix_Boxes Currently DirectoryInfo dic = new DirectoryInfo(sAppCitrixPath); FileInfo[] fic = dic.GetFiles("*.txt"); for (int i = 0; i < fic.Length; i++) { ParseQWinStaServerFile(fic[i].FullName.ToString(), fic[i].Name.ToString().ToUpper().Replace(".TXT","")); File.Delete(fic[i].FullName.ToString()); } }

   private void ParseQWinStaServerFile(string sLocation,string sServer)
    {
        using (StreamReader sr = File.OpenText(sLocation))
        {
            string sRecord = String.Empty;
            char[] cSep = new char[] {' '};

            bool bFirst = true;
            while ((sRecord = sr.ReadLine()) != null)
            {
                if (bFirst == false)
                {
                    string[] items = sRecord.Split(cSep, StringSplitOptions.RemoveEmptyEntries);
                    //Make sure all columns are present on the split for valid records
                    if (sRecord.Substring(19, 1) != " ") // check position of user id to see if it's their 
                    {

                        //Send the user id and server name where you want to.
                         here is your user id = items[1].ToString().ToLower().Trim()
                         here is your server sServer
                    };
                }
                else
                {
                    bFirst = false;
                }
            }
        }
    }