65.9K
CodeProject 正在变化。 阅读更多。
Home

如何查找用户的电子邮件地址

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.11/5 (15投票s)

2018 年 8 月 19 日

CPOL

1分钟阅读

viewsIcon

25447

downloadIcon

501

这里有一种方法可以找到运行程序的用户使用的电子邮件地址/地址。

引言

Stack Overflow 上一个问题的启发下,我写了这篇文章,内容是关于查找用户的电子邮件地址,或者如果他/她有多个地址的话。

背景

我查看了注册表,通过搜索我在整个注册表中的电子邮件地址来了解如何操作。 这是一种相当棘手的方法,可以(很有可能)从用于登录 Microsoft 服务的存储电子邮件中找到用户的电子邮件地址。 有许多电子邮件客户端和方法,包括网络邮件(Gmail、Yahoo 等)和桌面客户端(Outlook)等等,但假设典型用户会使用主电子邮件地址登录 Windows(并且大多数 Windows 用户甚至使用其 Windows 帐户的凭据登录到他们的 PC),这就可以工作了!

Using the Code

Windows 将用作 "Live ID" 的电子邮件帐户存储在“UserExtendedProperties”键中

HKEY_CURRENT_USER\Software\Microsoft\IdentityCRL

假设该电子邮件是由用户选择的用于登录 PC 和/或其它 Windows 服务的 Windows 用户名。

因此,您可以使用以下代码获取电子邮件帐户

//
// void GetDefaultEmailAddress()
{
    HKEY key;
    TCHAR    achKey[MAX_KEY_LENGTH];        // buffer for subkey name
    DWORD    cbName;                        // size of name string 
    TCHAR    achClass[MAX_PATH] = TEXT(""); // buffer for class name 
    DWORD    cchClassName = MAX_PATH;       // size of class string 
    DWORD    cSubKeys = 0;                  // number of subkeys 
    DWORD    cbMaxSubKey;                   // longest subkey size 
    DWORD    cchMaxClass;                   // longest class string 
    DWORD    cValues;                       // number of values for key 
    DWORD    cchMaxValue;                   // longest value name 
    DWORD    cbMaxValueData;                // longest value data 
    DWORD    cbSecurityDescriptor;          // size of security descriptor 
    FILETIME ftLastWriteTime;               // last write time 

    DWORD i, retCode;

    TCHAR  achValue[MAX_VALUE_NAME];
    DWORD cchValue = MAX_VALUE_NAME;

    if (RegOpenKeyEx(HKEY_CURRENT_USER, L"Software\\Microsoft\\IdentityCRL\\UserExtendedProperties", 
                     NULL, KEY_READ, &key) == ERROR_SUCCESS)
    {
        // Get the class name and the value count. 
        retCode = RegQueryInfoKey(
            key,                            // key handle 
            achClass,                       // buffer for class name 
            &cchClassName,                  // size of class string 
            NULL,                           // reserved 
            &cSubKeys,                      // number of subkeys 
            &cbMaxSubKey,                   // longest subkey size 
            &cchMaxClass,                   // longest class string 
            &cValues,                       // number of values for this key 
            &cchMaxValue,                   // longest value name 
            &cbMaxValueData,                // longest value data 
            &cbSecurityDescriptor,          // security descriptor 
            &ftLastWriteTime);              // last write time 

        // Enumerate the email accounts subkeys, until RegEnumKeyEx fails.

        if (cSubKeys)
        {
            wprintf(TEXT("\nNumber of email accounts used: %d\n"), cSubKeys);

            for (i = 0; i < cSubKeys; i++)
            {
                cbName = MAX_KEY_LENGTH;
                retCode = RegEnumKeyEx(key, i,
                    achKey,
                    &cbName,
                    NULL,
                    NULL,
                    NULL,
                    &ftLastWriteTime);
                if (retCode == ERROR_SUCCESS)
                {
                    wprintf(TEXT("(%d) %s\n"), i + 1, achKey);
                }
            }
        }
    }
}

//

关注点

对于用于电子邮件的桌面应用程序(即 MAPI 客户端),要枚举这些客户端的地方是

Software\Clients\Mail Key in HKEY_LOCAL_MACHINE.

在那里,您将找到所有已安装的 MAPI 客户端

您还可以通过查看来确定默认客户端

HKEY_LOCAL_MACHINE\SOFTWARE\Clients\Mail\Default.
© . All rights reserved.