2012-09-07 35 views
5

Làm cách nào để kiểm tra từ C# nếu tài khoản người dùng cục bộ (cụ thể là tài khoản Quản trị viên cục bộ) đang hoạt động?Cách đăng ký C# nếu tài khoản người dùng đang hoạt động

Điều tôi thực sự muốn là thay thế C# cho đầu ra "Tài khoản đang hoạt động" = "Có" (hoặc "Không") từ lệnh "Quản trị viên người dùng mạng".

Tôi sợ câu hỏi này trông giống như một bản sao của this một câu hỏi, nhưng tôi không biết phải chuyển cho tham số cho đối tượng Root DirectoryEntry. Đã thử những thứ khác nhau như "ldap: //" + Environment.MachineName, "ldap: //127.0.0.1", "WinNT: //" + Environment.MachineName, nhưng không ai trong số họ làm việc. Tôi nhận được một ngoại lệ ném bởi các searcher.FindAll() gọi trong cả ba trường hợp.

+0

gì ngoại trừ bạn đang nhận được? – BlackICE

+0

Với "ldap: //" + Environment.MachineName tôi nhận được một COMException với thông điệp "Máy chủ không hoạt động." và ErrorCode = -2147016646. Tương tự với "ldap: //127.0.0.1". – candritzky

+0

Với "WinNT: //" + Environment.MachineName tôi nhận được một NotSupportedException với thông báo "Nhà cung cấp không hỗ trợ tìm kiếm và không thể tìm kiếm WinNT: // ." – candritzky

Trả lời

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

Cảm ơn, điều này cũng hoạt động. Nhưng cuộc gọi FindByIdentity đôi khi mất vài giây trước khi nó trả về kết quả. Vì vậy, mặc dù mã tốt đẹp của nó, nó không phải là giải pháp tốt nhất từ ​​một quan điểm hiệu suất. – candritzky

+0

Tôi cũng nhận thấy rằng, nhưng tôi nghĩ có một số mở đầu kết nối hoặc một cái gì đó như thế, bởi vì khi tôi đã làm các truy vấn tiếp theo họ đã rất nhanh. – BlackICE

1

Bạn có thể truy vấn WMI của Win32_UserAccount

Đây là soạn sẵn những gì MS của mã WMI tạo spits ra như một tài liệu tham khảo;

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); 
      } 
     } 
    } 
} 

(Tôi muốn liên kết công cụ này nhưng như thường lệ các liên kết MSDN đã chết)

+0

Điều đó đã làm được! Tôi đã phải thêm "domain = '" + Environment.MachineName + "'" vào truy vấn WMI để hạn chế kết quả với tài khoản người dùng cục bộ, nhưng sau đó nó hoạt động. Cảm ơn rất nhiều! – candritzky

0

This không phải là khá giống nhau nhưng họ sử dụng DirectoryEntry directoryEntry = new DirectoryEntry(string.Format("WinNT://{0}/{1}", computerName, username)); có giúp đỡ đó?

+0

Không, không hoạt động. Trả về một tập kết quả trống. – candritzky

1

Hãy thử điều này.

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

Hoạt động hoàn hảo. Cảm ơn! – candritzky

0

Xét người dùng địa phương, bạn cần gọi số win32 api funcion NetGetUserInfo để nhận những gì bạn cần.

Ví dụ trong pinvoke.net là gần như những gì bạn cần, tuy nhiên bạn cần phải thay đổi các tham số mức 2 để có được những neccesary info

+0

Cảm ơn bạn. Điều này cũng có thể làm việc. Chưa thử nó. Tôi đoán bạn đang đề cập đến trường USER_INFO_2.usri2_flags (UF_ACCOUNTDISABLE). Mặc dù tôi nên tránh P/Gọi và gắn bó với một giải pháp C# WMI hoặc LDAP thuần túy. – candritzky

Các vấn đề liên quan