1

我正在尝试接收当前连接到 AD 的所有计算机以及其中哪些计算机有用户登录到 AD。我已经尝试使用ComputerPrincipal's.LastLogon属性,但我得到一个完全关闭的值,大约一周。

我想知道 AD 中哪些计算机可用。我可以使用另一种方法吗?

PrincipalContext ctx = new PrincipalContext(ContextType.Domain, "192.168.0.101:389", "Administrator", "XXXX");

// define a "query-by-example" principal - here, we search for a ComputerPrincipal 
ComputerPrincipal qbeComputer = new ComputerPrincipal(ctx);

// create your principal searcher passing in the QBE principal    
PrincipalSearcher srch = new PrincipalSearcher(qbeComputer);

// find all matches
foreach (var found in srch.FindAll())
{
    // do whatever here - "found" is of type "Principal" - it could be user, group, computer.....          
    ComputerPrincipal cp = found as ComputerPrincipal;

    if (cp != null)
    {
       string computerName = cp.Name;
       DateTime? lastLogon = new DateTime();
       lastLogon = cp.LastLogon;
       DateTime convertedDate = DateTime.SpecifyKind(DateTime.Parse(cp.LastLogon.ToString()), DateTimeKind.Utc);

       var kind = convertedDate.Kind;
       DateTime dt = convertedDate.ToLocalTime();

       Response.Write(cp.Name+"   :   "+ dt.ToString()+ "<br />");
    }
 }

编辑:

我希望打印出来是这样的:

计算机 1:正确 计算机 2:错误 计算机 3:错误 计算机 4:正确

如果当前已登录,是否无法查询计算机?我只需要一个布尔值,True 或 False。

4

2 回答 2

0

这是一个经典的 MCSE 问题。lastlogon 字段是该特定 DC 的本地字段,而不是全局复制的。

您需要查询每个 AD 域控制器并查找每个域的最近日期。

于 2012-05-29T12:19:53.257 回答
0

您需要查询林/域中所有域控制器上的安全事件日志,以确保用户已登录某台机器。然后您应该使用 WMI 联系此工作站以检查用户是否仍然登录。

您可能感兴趣的事件是具有交互式登录类型的登录事件(ID 4624 用于登录,4634 用于注销)。

但是,当 PC 失去与域的连接(笔记本电脑很常见)并且用户注销时,没有域控制器将收到注销事件。

用户实际上可以在没有域的情况下登录,之前已经在 PC 上创建了他的帐户的本地缓存。

正如其他人所说,lastlogon 和 lastlogontimestamp 不能用于可靠的方式来跟踪用户登录,检查这个这个

这里有一些例子

更多信息在这里这里

于 2012-05-29T12:29:55.737 回答