I have a winform C # application that will be installed on Windows 7, Vista and XP, 32 or 64 bit machines, with operating systems in English, German and Spanish (and other languages ββin the future).
I need to get a list of all the administrator account and user names on the local computer. I just need a list of account names, nothing more.
The problem is that my code only works for English operating systems.
Is there a way to get user names on the local computer, regardless of the language of the OS, and regardless of whether it is XP, Vista or 7 and regardless of 32 or 64 bits?
I read a post somewhere about using the SID to get the local administrator name if it was renamed. Can using SID be helpful in solving my problem?
Below is my code. On a computer with a German OS, the code does not work in the line "DirectoryEntry admGroup = localMachine.Children.Find (" administrators "," group ");". This, most likely, fails, because in the German OS the words "administrators", "group" are most likely written differently. The same is probably true for the OS in Spanish.
My code for 32-bit OS:
DirectoryEntry localMachine = new DirectoryEntry( "WinNT://" + Environment.MachineName); DirectoryEntry admGroup = localMachine.Children. Find("administrators", "group"); object adminmembers = admGroup.Invoke("members", null); DirectoryEntry userGroup = localMachine.Children.Find("users", "group"); object usermembers = userGroup.Invoke("members", null); //Retrieve each user name. foreach (object groupMember in (IEnumerable)adminmembers) { DirectoryEntry member = new DirectoryEntry(groupMember); if (!(member.Name == "admin" || member.Name == "Domain Admins")) { drow = dtWindowsUser.NewRow(); drow["WindowsUser"] = member.Name; //Add row to datatable dtWindowsUser.Rows.Add(drow); } } foreach (object groupMember in (IEnumerable)usermembers) { DirectoryEntry member = new DirectoryEntry(groupMember); if (!(member.Name == "ACTUser" || member.Name == "ASPNET" || member.Name == "Domain Users" || member.Name == "Authenticated Users" || member.Name == "INTERACTIVE" || member.Name == "SQLDebugger")) { drow = dtWindowsUser.NewRow(); drow["WindowsUser"] = member.Name; //Add row to datatable dtWindowsUser.Rows.Add(drow); } }
My code for 64bit OS:
SelectQuery query = new SelectQuery("Win32_UserAccount"); ManagementObjectSearcher searcher = new ManagementObjectSearcher(query); foreach (ManagementObject envVar in searcher.Get()) { str_name = envVar["Name"].ToString(); if (!(str_name == "admin" || str_name == "Domain Admins")) { if (!(str_name == "ACTUser" || str_name == "ASPNET" || str_name == "Domain Users" || str_name == "Authenticated Users" || str_name == "INTERACTIVE" || str_name == "SQLDebugger")) { if (!(str_name == "HomeGroupUser$")) { drow = dtWindowsUser.NewRow(); drow["WindowsUser"] = str_name; //Add row to datatable dtWindowsUser.Rows.Add(drow); } } } }
Frederick
source share