WNetEnumResource
От: akela  
Дата: 24.10.02 13:11
Оценка:
Здравствуйте!
У меня такая проблема: мне надо перечислить имена всех компьютеров в сети. Вроде это делается через WNetEnumResource. Но беда в том, что у меня это получается о-о-очень медленно (секунд 30) (. Это нормально, или что-то не так? Если кто знает, подскажите пожалуйста, как это сделать быстро! Спасибо.
Re: WNetEnumResource
От: Алекс Россия http://wise-orm.com
Дата: 24.10.02 13:32
Оценка:
Здравствуйте akela, Вы писали:

A>Здравствуйте!

A>У меня такая проблема: мне надо перечислить имена всех компьютеров в сети. Вроде это делается через WNetEnumResource. Но беда в том, что у меня это получается о-о-очень медленно (секунд 30) (. Это нормально, или что-то не так? Если кто знает, подскажите пожалуйста, как это сделать быстро! Спасибо.

Может воспользуешся AD?
    Dim c, c1, c2, s
    Set c1 = GetObject("LDAP://RootDSE")
    s = "LDAP://" & "cn=computers," & c1.Get("RootDomainNamingContext")
    Set c = GetObject(s)
    For Each c2 In c
        Debug.Print c2.Name
    Next


Это пример на VB. Если будут проблемы с переносом на VC, свистни!
Re[2]: WNetEnumResource
От: akela  
Дата: 24.10.02 14:04
Оценка:
Здравствуйте Алекс, Вы писали:

А>Может воспользуешся AD?

А>
А>    Dim c, c1, c2, s
А>    Set c1 = GetObject("LDAP://RootDSE")
А>    s = "LDAP://" & "cn=computers," & c1.Get("RootDomainNamingContext")
А>    Set c = GetObject(s)
А>    For Each c2 In c
А>        Debug.Print c2.Name
А>    Next
А>


А>Это пример на VB. Если будут проблемы с переносом на VC, свистни!


Уже свищу. Честно сознаюсь, что ни строчки не понимаю .
Re[3]: WNetEnumResource
От: Алекс Россия http://wise-orm.com
Дата: 25.10.02 08:12
Оценка:
Здравствуйте akela, Вы писали:

хъ

A>Уже свищу. Честно сознаюсь, что ни строчки не понимаю .


Я бы посоветовал, все-таки, сначала разобраться с AD, потому что и здесь наврядли поймешь.

//stdafx.h
#include <atlbase.h>
#include <activeds.h>
#include <iostream>
#include <initguid.h>

//main.cpp

#include "stdafx.h"

using std::cout;
using std::endl;

#pragma comment(lib,"ActiveDS")
#pragma comment(lib,"adsiid")

int main(int argc, char* argv[])
{
    HRESULT hr;
    CoInitialize(NULL);
    CComPtr<IADs> pRoot;
    CComVariant dc;
    hr = ADsGetObject(L"LDAP://RootDSE",IID_IADs,(void**)&pRoot);
    if (SUCCEEDED(hr)){
        hr = pRoot->Get(CComBSTR("RootDomainNamingContext"),&dc);
        if (SUCCEEDED(hr)){
            USES_CONVERSION;
            CComBSTR str("LDAP://cn=computers,");
            str += CComBSTR(dc.bstrVal);
            CComPtr<IADsContainer> pComputers;
            hr = ADsGetObject(str,IID_IADsContainer,(void**)&pComputers);
            if (SUCCEEDED(hr)){
                CComPtr<IUnknown> pUnk;
                CComPtr<IEnumVARIANT> pCompEnum;
                ULONG returned;
                CComVariant Comp;
                hr = pComputers->get__NewEnum(&pUnk);
                if (SUCCEEDED(hr)){
                    hr = pUnk->QueryInterface(&pCompEnum);
                    if (SUCCEEDED(hr)){
                        while (pCompEnum->Next(1, &Comp, &returned) == S_OK)
                        {
                            CComPtr<IADs> pComputer;
                            Comp.ChangeType(VT_UNKNOWN);
                            hr = Comp.pdispVal->QueryInterface(&pComputer);
                            if (SUCCEEDED(hr)){
                                hr = pComputer->get_Name(&str);
                                if (SUCCEEDED(hr))
                                    cout << OLE2A(str) << endl;
                            }
                            Comp.Clear();
                        }
                    }
                }
            }
        }
        pRoot = NULL;
    }
    CoUninitialize();
    return 0;
}


Обработку ошибок можешь сделать сам.
Re[4]: WNetEnumResource
От: akela  
Дата: 25.10.02 08:49
Оценка:
Здравствуйте Алекс, Вы писали:

А>Я бы посоветовал, все-таки, сначала разобраться с AD, потому что и здесь наврядли поймешь.


Между прочим, так гораздо понятнее .
Но есть проблема: правильно ли я понимаю, что это не будет работать в Win95 и Win98? Сколь это не грустно, но мне принципиальна работоспособность в этих ОС.
Re[5]: WNetEnumResource
От: Алекс Россия http://wise-orm.com
Дата: 25.10.02 08:54
Оценка:
Здравствуйте akela, Вы писали:

A>Здравствуйте Алекс, Вы писали:


хъ

A>Между прочим, так гораздо понятнее .

A>Но есть проблема: правильно ли я понимаю, что это не будет работать в Win95 и Win98? Сколь это не грустно, но мне принципиальна работоспособность в этих ОС.

Почему не будет? Очень даже будет. Необходимо только качнцть кое-какие либы и все.

MSDN:
Requires Active Directory Client Extension on Windows NT 4.0 SP6a and Windows 95/98/Me.
Re[6]: WNetEnumResource
От: akela  
Дата: 25.10.02 12:13
Оценка:
Здравствуйте Алекс, Вы писали:

А>Здравствуйте akela, Вы писали:


А>Почему не будет? Очень даже будет. Необходимо только качнцть кое-какие либы и все.


А>MSDN:

А>Requires Active Directory Client Extension on Windows NT 4.0 SP6a and Windows 95/98/Me.

Ой елки, боюсь мне вряд ли дадут это сделать. И все-таки — долгая работа WNetEnumResource — это нормально, или глюк?
Re: WNetEnumResource
От: Алекс Россия http://wise-orm.com
Дата: 30.10.02 16:35
Оценка:
Здравствуйте akela, Вы писали:

A>Здравствуйте!

A>У меня такая проблема: мне надо перечислить имена всех компьютеров в сети. Вроде это делается через WNetEnumResource. Но беда в том, что у меня это получается о-о-очень медленно (секунд 30) (. Это нормально, или что-то не так? Если кто знает, подскажите пожалуйста, как это сделать быстро! Спасибо.

Может попробовать использовать NetServerEnum?
Re: WNetEnumResource
От: Филич Россия  
Дата: 21.04.05 07:19
Оценка:
Здравствуйте, akela, Вы писали:

A>У меня такая проблема: мне надо перечислить имена всех компьютеров в сети. Вроде это делается через WNetEnumResource. Но беда в том, что у меня это получается о-о-очень медленно (секунд 30)


вероятно дело во флажках. попробуй в вызове WNetOpenEnum() параметр dwUsage установить RESOURCEUSAGE_CONTAINER.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.