2012-09-07 16 views
5

Yerel kullanıcı hesabı (yerel yönetici hesabı) etkinse, C#'den nasıl kontrol edebilirim?Kullanıcı hesabı etkinse C# nasıl denetlenir

Asıl istediğim, "net user Administrator" komutundan "Account Active" = "Yes" (veya "No") çıkışı için bir C# değiştirmesidir.

Korkarım bu soru this bir kopyası gibi görünüyor, ancak kök DirectoryEntry nesnesinin parametresi için ne gireceğimi bilmiyorum. "Ldap: //" + Environment.MachineName, "ldap: //127.0.0.1", "WinNT: //" + Environment.MachineName gibi farklı şeyler denedi, ancak bunların hiçbiri işe yaramadı. Her üç durumda da searcher.FindAll() çağrısı tarafından atılan bir istisna alıyorum.

+0

almak için 2'ye düzey parametreyi değiştirmek gerekir gerekenler? – BlackICE

+0

"ldap: //" + Environment.MachineName ile "Sunucu çalışma değil" iletisiyle bir COMException alıyorum. ve ErrorCode = -2147016646. "Ldap: //127.0.0.1" ile aynı. – candritzky

+0

"WinNT: //" + Environment.MachineName ile "Destekleyici arama yapmayı desteklemiyor ve WinNT'de arama yapamıyor: // ." Ile bir NotSupportedException alıyorum. – candritzky

cevap

5
class Program 
{ 
    static void Main(string[] args) 
    { 

     // Create the context for the principal object. 
     PrincipalContext ctx = new PrincipalContext(ContextType.Machine); 

     UserPrincipal u = UserPrincipal.FindByIdentity(ctx, IdentityType.SamAccountName, "Administrator"); 
     Console.WriteLine(String.Format("Administrator is enable: {0}", u.Enabled)); 

    } 
} 
+0

Teşekkürler, bu da işe yarıyor. Ancak FindByIdentity çağrısı bazen sonuç döndürmeden önce birkaç saniye sürer. Güzel kodu olmasına rağmen, performans açısından en iyi çözüm değildir. – candritzky

+0

Bunun da farkına vardım, ama sanırım bağlantıyı ya da bunun gibi bir şeyleri açmak için bazı yükler var, çünkü daha sonraki sorguları yaptıkları zaman çok hızlıydılar. – BlackICE

1

Sen sorgulayabilir WMI en Win32_UserAccount

Bu MS'nin wmı kod yaratıcısı bir referans olarak tükürür neyi Demirbaş ise;

using System; 
using System.Management; 
using System.Windows.Forms; 

namespace WMISample 
{ 
    public class MyWMIQuery 
    { 
     public static void Main() 
     { 
      try 
      { 
       ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\CIMV2", "SELECT Disabled FROM Win32_UserAccount WHERE name = 'alexk'"); 

       foreach (ManagementObject queryObj in searcher.Get()) 
       { 
        Console.WriteLine("-----------------------------------"); 
        Console.WriteLine("Win32_UserAccount instance"); 
        Console.WriteLine("-----------------------------------"); 
        Console.WriteLine("Disabled: {0}", queryObj["Disabled"]); 
        Console.ReadKey(); 
       } 
      } 
      catch (ManagementException e) 
      { 
       MessageBox.Show("An error occurred while querying for WMI data: " + e.Message); 
      } 
     } 
    } 
} 

+0

Bu başardı! Sonuçları yerel kullanıcı hesaplarıyla kısıtlamak için WMI sorgusuna "domain = '" + Environment.MachineName + "'" eklemeliydim, ancak sonra çalışıyor. Çok teşekkürler! – candritzky

0

This oldukça aynı değildir ama onlar DirectoryEntry directoryEntry = new DirectoryEntry(string.Format("WinNT://{0}/{1}", computerName, username)); kullanmak (Ben aracı bağlamak istiyorum ama her zamanki gibi msdn bağlantılar öldü) o yardım misiniz?

+0

Hayır, çalışmıyor. Boş bir sonuç kümesini döndürür. – candritzky

1

Bunu deneyin.

var server = "YOURMACHINENAME"; 
var username = "Guest"; 
var de = new DirectoryEntry {Path = "WinNT://" + server + ",computer"}; 
var result = de.Children 
    .Cast<DirectoryEntry>() 
    .First<DirectoryEntry>(d => d.SchemaClassName == "User" && d.Properties["Name"].Value.ToString() == username); 

var flags = (int)result.Properties["UserFlags"].Value; 
var disabled = (flags & 2) == 2; 
+0

Mükemmel çalışıyor. Teşekkürler! – candritzky

0

bir yerel kullanıcı var düşünürsek, neye ihtiyacınız almak için win32 api görevi görüyordu NetGetUserInfo çağırmanız gerekir.

pinvoke.net içinde örnektir neredeyse, ancak alıyorsanız ne istisna neccesary info

+0

Teşekkür ederim. Bu da işe yarayabilir. Henüz denemedim. USER_INFO_2.usri2_flags alanına (UF_ACCOUNTDISABLE) atıfta bulunuyorsunuz. P/Invoke ve saf C# WMI veya LDAP çözümü ile sopa önlemek daha iyi olsa da. – candritzky

İlgili konular