Получить список всех компьютеров, а также если они вошли в AD

Я пытаюсь получить все компьютеры в своем AD, а также какие из них в настоящее время вошли в систему. Я пытался сделать это, проверив «lastLogonStamp», но это возвращает неправильное значение, говоря, что мой сервер был зарегистрирован в AD восемь дней назад. . Даже если я перезапущу сервер, он говорит то же самое. Я получил код из другого вопроса здесь:

Как перечислить все компьютеры и время последнего входа в AD?

public DataTable GetListOfComputers(string domain, string userName, string password)
    {
        DirectoryEntry entry = new DirectoryEntry("LDAP://" + domain,
                userName, password, AuthenticationTypes.Secure);
        DirectorySearcher search = new DirectorySearcher(entry);
        string query = "(objectclass=computer)";
        search.Filter = query;

        search.PropertiesToLoad.Add("name");
        search.PropertiesToLoad.Add("lastLogonTimestamp");

        SearchResultCollection mySearchResultColl = search.FindAll();

        DataTable results = new DataTable();
        results.Columns.Add("name");
        results.Columns.Add("lastLogonTimestamp");

        foreach (SearchResult sr in mySearchResultColl)
        {
            DataRow dr = results.NewRow();
            DirectoryEntry de = sr.GetDirectoryEntry();
            dr["name"] = de.Properties["Name"].Value;
            dr["lastLogonTimestamp"] = DateTime.FromFileTimeUtc(long.Parse(sr.Properties["lastLogonTimestamp"][0].ToString()));
            results.Rows.Add(dr);
            de.Close();
        }

        return results;
    }

person Olof Wännström    schedule 10.05.2012    source источник
comment
Спасибо за быстрый ответ! Куда передать учетные данные? В моем примере я передал IP-адрес AD-серверу, Администратору, Паролю. Как мне аутентифицировать себя? PS. Мой веб-сервер не находится в AD. Я просто подключаюсь к нему извне. ДС.   -  person Olof Wännström    schedule 10.05.2012


Ответы (1)


Если вы используете .NET 3.5 и более поздние версии, вы можете использовать PrincipalSearcher и принципал "запрос-по-примеру" для выполнения поиска:

// create your domain context
PrincipalContext ctx = new PrincipalContext(ContextType.Domain);

// 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 = cp.LastLogon;
    }
}

Если вы еще этого не сделали, обязательно прочтите статью MSDN Managing Directory Security Principals в . NET Framework 3.5, который прекрасно показывает, как наилучшим образом использовать новые возможности System.DirectoryServices.AccountManagement. Или см. документацию MSDN по System.DirectoryServices.AccountManagement пространство имен.

person marc_s    schedule 10.05.2012