Приобретите адрес электронной почты пользователя?
Есть ли способ получить адрес электронной почты пользователя из Windows через Win32 или .NET? Есть ли раздел реестра или API, содержащий эту информацию?
EDIT: У меня есть приложение, которое отправляет мою компанию, если наше приложение терпит неудачу, и я хотел бы получить адрес электронной почты с возвратом, чтобы мы могли ответить на этот вопрос, который испытал сбой. В настоящее время я получаю имя пользователя, но это может не совпадать с именем электронной почты. Очевидно, я могу заставить пользователя ввести свой адрес электронной почты, но интерфейс был бы немного более дружелюбным, если бы я мог хотя бы попытаться получить адрес электронной почты и попросить пользователя проверить правильность адреса электронной почты.
Ответы
Ответ 1
Единственный способ, я могу думать, что это имеет смысл в среде Windows Active Directory. В этом случае вы можете запросить AD и посмотреть, есть ли адрес электронной почты, связанный с учетной записью пользователя. Это определенно будет работать с MS Exchange и может также работать с другими системами электронной почты предприятия. Для .Net вы можете использовать классы в пространстве имен System.DirectoryServices. Для Win32 вы можете использовать ADSI API. Вам нужно будет прочитать AD и создать подходящий запрос в соответствии с вашими требованиями.
Ответ 2
Вы сохранили свой адрес электронной почты где-то в системе? Нет стандартного места для поиска. Я всегда зависим от приложений, которые использует пользователь (Outlook, Outlook Express, TuhunderBird).
Лучший способ получить адрес электронной почты пользователей - спросить его.
Ответ 3
Позвольте мне ответить вам, спросив вас: вы когда-либо вводили свой адрес электронной почты при установке окон?
Ответ 4
Вы можете попробовать использовать константу NameUserPrincipal
из перечисления EXTENDED_NAME_FORMAT
с помощью GetUserNameEx
.
NameUserPrincipal Имя участника-пользователя (например, [email protected]).
Но я бы рекомендовал использовать это как предварительно заполненный адрес в приглашении пользователю.
Вероятно, что с GetLastError
в ERROR_NONE_MAPPED
он не сработает, но если информация недоступна.
Ответ 5
Я думаю, что простой ответ - нет... но, конечно, адрес электронной почты будет сохранен в их почтовой программе, такой как Outlook.
Чего вы пытаетесь достичь?
Ответ 6
Windows хранит использованные учетные записи электронной почты в ключе "UserExtendedProperties
" в
HKEY_CURRENT_USER\Software\Microsoft\IdentityCRL
Таким образом, вы можете получить учетные записи электронной почты, используя следующий код:
#include <windows.h>
#include <stdio.h>
#include <tchar.h>
#define MAX_KEY_LENGTH 255
#define MAX_VALUE_NAME 16383
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
в HKEY_LOCAL_MACHINE.
You will find there all installed [MAPI clients][1].
.
Вы также можете определить значение по умолчанию, посмотрев на:
HKEY_LOCAL_MACHINE\SOFTWARE\Clients\Mail\Default.
Смотрите также: статью и инструмент/исходный код для загрузки
Ответ 7
Адреса электронной почты могут быть для веб-клиентов, таких как gmail или они могут быть адресами электронной почты домена. В любом случае реализация должна основываться на специфике настройки электронной почты пользователя. Таким образом, короткий ответ "нет", по крайней мере, нет метода "один размер-подходит всем".
Ответ 8
Может быть НЕКОТОРЫЙ адрес электронной почты, хранящийся в Windows, но для того, чтобы вы получили фактический адрес электронной почты пользователя, вы должны ввести его в него, и, чтобы убедиться в этом, вы должны квитироваться, отправив им активировать электронную почту до вас используйте его.
Ответ 9
Я знаю, что это старый вопрос, но если вы, как и я, прибываете сюда, согласно этому ответу на Superuser
https://superuser.com/info/836220/get-email-address-of-current-logged-in-user
На CMD запустите whoami /upn
Это дает пользователю принципал, который часто является электронной почтой по умолчанию
https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/whoami