Delphi, WMI. Как узнать имя пользователя удаленного компьютера в домене??

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Dronga, 3 Nov 2008.

  1. Dronga

    Dronga ВАША реклама ТУТ!!

    Joined:
    1 Jul 2005
    Messages:
    575
    Likes Received:
    239
    Reputations:
    249
    Нужен примерчик, а лучше грамотная консультация на пальцах по сабжу.

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

    То есть, имеется машина в домене, известно её имя, включенная, за которой работает пользователь. Необходимо подключиться к его WMI и узнать имя пользователя.

    На VB/vbs/wsh задача решается намного проще, но хочу именно на Delphi 7. Может кто чем поможет..
     
    #1 Dronga, 3 Nov 2008
    Last edited: 3 Nov 2008
  2. ronald

    ronald Elder - Старейшина

    Joined:
    27 Mar 2008
    Messages:
    252
    Likes Received:
    42
    Reputations:
    6
    доступ к компу есть?
     
    1 person likes this.
  3. ronald

    ronald Elder - Старейшина

    Joined:
    27 Mar 2008
    Messages:
    252
    Likes Received:
    42
    Reputations:
    6
    как вариант, если удалённая пробуй Telnet
     
  4. Dronga

    Dronga ВАША реклама ТУТ!!

    Joined:
    1 Jul 2005
    Messages:
    575
    Likes Received:
    239
    Reputations:
    249
    К компу доступа нет. Гуру, мне бы всё-таки через WMI как-то..
     
  5. Dian

    Dian Elder - Старейшина

    Joined:
    2 Sep 2008
    Messages:
    57
    Likes Received:
    11
    Reputations:
    4
    Не знаю на счет WMI, но я пришел к выводу, что иногда вполне проходят "топорные" решения типа запуска nbtstat'а
     
    1 person likes this.
  6. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    покрайней мере тут нужно иметь еще права админа на домене или подобные. чтобы можно было подключаться к другим компам с подобной целью. Ты лучше выложи код на VB а там можно будет глянуть и переписать на дельфу
     
    1 person likes this.
  7. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    А вообще советую почитать хорошую статейку по использованию WMI в Delphi
    http://www.delphikingdom.com/asp/viewitem.asp?catalogid=698

    довольно доступно описано. И есть у тебя есть код на VB то именно в WMIшной реализации практически одинаково будет всё
     
    1 person likes this.
  8. NetSter

    NetSter Moderator

    Joined:
    30 Jul 2007
    Messages:
    810
    Likes Received:
    414
    Reputations:
    62
    2 Dronga, в дельфине сильно не разбираюсь но вот что интересного нашел по твоей теме
    Здесь
    и очень интересная
    КНИГА
     
    _________________________
    1 person likes this.
  9. Dronga

    Dronga ВАША реклама ТУТ!!

    Joined:
    1 Jul 2005
    Messages:
    575
    Likes Received:
    239
    Reputations:
    249
    NetSter, спасибо, но в примере не используется WMI интерфейс. Вообще там uses не вижу.. Есть только external 'netapi32.dll' Name 'NetWkstaUserEnum';

    За книгу отдельное спасибо, обязательно прогляжу, но может дашь линк сразу на нужный пример/главу?

    slesh, вся проблема в том что это единственный мануал по теме на Delphi ))) Не хотел его здесь выкладывать сразу, думал может кто что ещё подскажет)))
    Там используется для возвращаемых данных тип IEnumVariant, при этом сам автор называет это финтом ушами)) В силу весьма ограниченных знаний ищу более простой реализации на понятных типах данных. Поэтому очень желателен примерчик с адаптацией вывода в Edit, там где будет просто String. Стратегически важно проделать фокус на Delphi 7, но если будет проще, то вот пример на VB:
    Code:
    strComputer = Text1.Text
    Set objWMIService = GetObject("winmgmts:" _
        & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2") 
    
    Set colComputer = objWMIService.ExecQuery _
        ("Select * from Win32_ComputerSystem")
    
    For Each objComputer in colComputer
        Text1.Text = objComputer.UserName
    Next
    Вешаем на нажатие кнопки, вводим в текстовое поле сетевое имя машины (не IP, а имя), далее программа подсоединяется к WMI интерфейсу удаленной машины, выполняет запрос. В итоге, в наш список возвращается текущий (!) пользователь.

    Надо тоже самое на Delphi) Или кто-нибудь, объясните пожалуста, на пальцах что же такое IEnumVariant.. msdn смотрел, не понял.
     
    #9 Dronga, 8 Nov 2008
    Last edited: 8 Nov 2008
  10. NetSter

    NetSter Moderator

    Joined:
    30 Jul 2007
    Messages:
    810
    Likes Received:
    414
    Reputations:
    62
    "Получение сетевого имени пользователя

    Вы можете попробовать этот код. Я без проблем использовал его под Netware LAN в течение долгого времени. Работа программы зависит от наличия NWCALLS.DLL на машине пользователя, но если он использовал сеть хоть раз, данная библиотека должна присутствовать на его машине."

    Code:
    unit GetLogin;
    
    {Данный модуль инкапсулирует несколько внешних функций библиотеки NWCALLS.DLL}
    {Создан на основе кода Григория Трубецкого}
    {Модуль содержит функции, возвращающие Netware User ID}
    {и полное имя пользователя.}
    
    interface
    uses
    SysUtils, Messages, Dialogs;
    function GetUserLogin: string;
    function GetUserFullName( SomeUser: string): string;
    
    implementation
    type
    NWTimeStamp = record
    Year:      byte;
    Month:     byte;
    Day:       byte;
    Hour:      byte;
    Minute:    byte;
    Second:    byte;
    DayOfWeek: byte;
    end;
    
    {Netware API - требуется NWCALLS.DLL}
    function NWGetDefaultConnectionID(var Connection: word): word;
    far; external 'NWCALLS';
    
    function NWGetConnectionNumber(Connection: word; var ConnectionNumber:
    word): word;
    far; external 'NWCALLS';
    
    function NWGetConnectionInformation(Connection: word;
    ConnectionNumber: word;
    ObjectName: pchar;
    var ObjectType: word;
    var ObjectID: word;
    var LoginTime: NWTimeStamp):word;
    far; external 'NWCALLS';
    
    function NWReadPropertyValue(Connection:       word;
    ObjectName:       pChar;
    ObjectType:       word;
    PropertyName:     pChar;
    DataSetIndex:     byte;
    DataBuffer:       pChar;
    var More:             byte;
    var Flags:            byte): word;
    far; external 'NWCALLS';
    { конец секции работы с Netware API }
    
    function GetUserLogin: string;
    var
    ConnectionID: word;
    ConnectionNumber: word;
    RC: word;
    Name: array[0..50] of Char;
    ObjectType: word;
    ObjectID: word;
    LoginTime: NWTimeStamp;
    begin
    RC := NWGetDefaultConnectionID(ConnectionID);
    RC := NWGetConnectionNumber(ConnectionID, ConnectionNumber);
    RC := NWGetConnectionInformation( ConnectionID,
    ConnectionNumber,
    Name,
    ObjectType,
    ObjectID,
    LoginTime);
    
    Result := StrPas(Name);
    end;
    
    function GetUserFullName( SomeUser: string): string;
    {Реально имя пользователя является свойством 'IDENTIFICATON'.
    Вы должны вызывать NWReadPropertyValue с параметрами (между прочим) вашего ConnectionID,
    имени объекта (такое же, как и логин пользователя, сетевое имя которого мы пытаемся узнать)
    и свойство name, которое нам необходимо получить, в нашем случае 'IDENTIFICATION'
    (это и есть искомая величина - полное имя пользователя).}
    
    var
    ConnectionID: word;
    RC: word;
    Name: array[0..50] of Char;
    ObjectType: word;
    PropName: array[0..14] of Char;
    DataSetIndex: byte;
    FullName: array[0..127] of Char;
    More: byte;
    Flags: byte;
    begin
    RC := NWGetDefaultConnectionID(ConnectionID);
    ObjectType := 256; {пользователь}
    StrPCopy(PropName, 'IDENTIFICATION');
    DataSetIndex := 1;
    StrPCopy(Name, SomeUser);
    RC := NWReadPropertyValue( ConnectionID,
    Name,
    ObjectType,
    PropName,
    DataSetIndex,
    FullName,
    More,
    Flags);
    if RC = 35324 then
    MessageDlg('Пользователь ' + SomeUser + ' на этом сервере не обнаружен!',
    mtError, [mbOK], 0);
    Result := StrPas(FullName);
    end;
    
    end.
    
    (c) копирайт
     
    _________________________
  11. Dronga

    Dronga ВАША реклама ТУТ!!

    Joined:
    1 Jul 2005
    Messages:
    575
    Likes Received:
    239
    Reputations:
    249
    balt, была уже эта ссылка. Так и не разобрались, что же такое IEnumVariant..