Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> E-mail текущего пользователя 
V
    Опции темы
bopoha
Дата 19.5.2008, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1283
Регистрация: 10.5.2006
Где: Беларусь, Минск

Репутация: нет
Всего: 21



Задача: Получить e-mail адрес (в формате SMTP) текущего пользовтеля Windows.

Среда: Рабочая станция входит в домен, у пользователя есть акаунт в MS Exchange.

Вариант решения:
1. Получить имя пользователя и путь к AD.
2. Найти пользователя в AD используя ADSI.
3. Прочитать из атрибутов (В этом нет уверенности)?

Вопросы:
Есть ли еще варианты?
Как получить путь AD, желательно в формате LDAP?
Может есть проще метод получения информации о текущем пользователе?

Это сообщение отредактировал(а) bopoha - 19.5.2008, 17:51
PM MAIL WWW ICQ Skype GTalk   Вверх
bopoha
Дата 22.5.2008, 11:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1283
Регистрация: 10.5.2006
Где: Беларусь, Минск

Репутация: нет
Всего: 21



Задача решена. Может кому понадобится.

Код

#include <windows.h>

#define SECURITY_WIN32
#pragma comment(lib, "Secur32.lib")
#include <security.h.>

#pragma comment(lib, "ADSIid.Lib")
#include <Iads.h>
#pragma comment(lib, "Activeds.lib")
#include <Adshlp.h>

int _tmain(int argc, _TCHAR* argv[])
{
    BOOLEAN bRes;
    
    WCHAR                 lpPathToUser[MAX_PATH];
    ULONG                 lSize = MAX_PATH;
    
    // get domain for search    
    try
    {
        bRes = GetUserNameExW( NameFullyQualifiedDN, lpPathToUser, &lSize );
        if ( 0 == bRes )
        {
            printf( "Fail: GetUserNameEx()" );
            return 1;
        }
    
        wprintf( L"NameFullyQualifiedDN: %s", lpPathToUser );    
    }
    catch(...)
    {
        printf( "Fail: Get domain for search()" );        
    }

    HRESULT hr;
    // get e-mail
    try
    {
        // COM inicialize
        hr = CoInitialize(NULL);
        if ( FAILED( hr ) ) 
        { 
            return 0; 
        }    
        
        IADsUser* pUser        = NULL;
        BSTR      bstrEmail = NULL;    
        WCHAR     stLdapPath[MAX_PATH];
        
        swprintf( stLdapPath, MAX_PATH, L"LDAP://%s", lpPathToUser );
        // get user
        try
        {
            hr = ADsGetObject( stLdapPath,
                               IID_IADsUser,
                               (void**) &pUser );
        } // try
        catch(...)        
        {
            printf( "Fail: get user" );    
        }

        if( SUCCEEDED( hr ) ) 
        { 
            try
            {            
                hr = pUser->get_EmailAddress( &bstrEmail );        
                if ( SUCCEEDED( hr ) )
                {            
                    wprintf( L"\nEmailAddress: %s\n", bstrEmail );                
                    ::SysFreeString( bstrEmail );
                }
            } // try
            catch(...)
            {
                printf( "Fail: acces to user propery error" );
            }

            pUser->Release();
        } // if
        else
        {
            printf( "Fail: ADsOpenObject()" );
            return 1;
        }

        // COM
        CoUninitialize();
    } // try
    catch(...)
    {
            printf( "Fail: get e-mail" );
    }

    return 0;
}


Большинство try/catch конечно же не нужны.
PM MAIL WWW ICQ Skype GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0415 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.