2012-10-05 11 views
8

Jak mogę uzyskać listę użytkowników lokalnego Windows (dotyczy tylko użytkowników, które pojawiają się w oknach logowania ekran)Jak mogę uzyskać listę Użytkownicy Local Windows (tylko użytkowników, które pojawiają się w Ekran logowania Windows)

Próbowałem wielu metod przy użyciu poleceń biblioteki Windows Principial & WMI. Wciąż otrzymuję Administrator, Gość & inne dziwne konta (VUSRNEIL-DELL, $ HOMEGROUPUSER, ASPNET ... itd.)

Żadne z tych 3 kont użytkownika nie pojawia się na ekranie logowania. Jak mogę odróżnić te typy użytkowników?

jestem kodowania w C#

Odpowiedz

3

Jeśli używasz WMI Win32_UserAccount można wyświetlać tylko te elementy, które spełniają następujące warunki:

  • Property AccountType ma flagę UF_NORMAL_ACCOUNT.
  • Właściwość Disabled jest false.
  • Właściwość Lockout to false.
  • Właściwość LocalAccount jest true.
  • Właściwość SIDType to SidTypeUser.

Jeśli nie można użyć WMI (lub nie chcesz go używać) to trzeba zrobić trochę więcej pracy, w zasadzie trzeba użyć NetGroupGetUsers funkcji wyliczyć wszystkich użytkowników. Zobacz przykład this article on CodeProject.

10

Wystarczy dodać odwołanie do System.Management w aplikacji konsoli i wypróbować ten kod:

using System; 
using System.Management; 
using System.Linq; 

namespace ConsoleApplication5 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      ManagementObjectSearcher usersSearcher = new ManagementObjectSearcher(@"SELECT * FROM Win32_UserAccount"); 
      ManagementObjectCollection users = usersSearcher.Get(); 

      var localUsers = users.Cast<ManagementObject>().Where(
       u => (bool)u["LocalAccount"] == true && 
        (bool)u["Disabled"] == false && 
        (bool)u["Lockout"] == false && 
        int.Parse(u["SIDType"].ToString()) == 1 && 
        u["Name"].ToString() != "HomeGroupUser$"); 

      foreach (ManagementObject user in localUsers) 
      { 
       Console.WriteLine("Account Type: " + user["AccountType"].ToString()); 
       Console.WriteLine("Caption: " + user["Caption"].ToString()); 
       Console.WriteLine("Description: " + user["Description"].ToString()); 
       Console.WriteLine("Disabled: " + user["Disabled"].ToString()); 
       Console.WriteLine("Domain: " + user["Domain"].ToString()); 
       Console.WriteLine("Full Name: " + user["FullName"].ToString()); 
       Console.WriteLine("Local Account: " + user["LocalAccount"].ToString()); 
       Console.WriteLine("Lockout: " + user["Lockout"].ToString()); 
       Console.WriteLine("Name: " + user["Name"].ToString()); 
       Console.WriteLine("Password Changeable: " + user["PasswordChangeable"].ToString()); 
       Console.WriteLine("Password Expires: " + user["PasswordExpires"].ToString()); 
       Console.WriteLine("Password Required: " + user["PasswordRequired"].ToString()); 
       Console.WriteLine("SID: " + user["SID"].ToString()); 
       Console.WriteLine("SID Type: " + user["SIDType"].ToString()); 
       Console.WriteLine("Status: " + user["Status"].ToString()); 
      } 

      Console.ReadKey(); 
     } 
    } 
} 
+1

To działa dobrze, ale może być powolna. Po uruchomieniu go na domenie systemu Windows 7 cała moja aplikacja działa w ciągu 5 sekund. Kiedy uruchamiam go na Windows 2008 Server, cała moja aplikacja zajmuje prawie 3 minuty. Główną różnicą jest pauza podczas iteracji przez znalezionych użytkowników. –

+1

localusers jest w twoim przykładzie nieużywaną zmienną, bo co to jest w wersji demo? – Offler

-2

To da Ci listę wszystkich kont użytkowników, ich domeny, pełną nazwę i SID.

wmic useraccount get domain,name,sid 
Powiązane problemy