有没有办法通过Win32或.NET从Windows中获取用户的电子邮件地址?是否有包含此信息的注册表项或API?
编辑:我有一个应用程序通过电子邮件发送给我的公司,如果我们的应用程序失败并且我想获得一个返回电子邮件地址,以便我们可以回复遇到崩溃的个人。我目前正在获取用户名,但这可能与电子邮件名称不符。显然我可以让用户输入他的电子邮件地址,但如果我至少可以尝试获取电子邮件地址并让用户验证返回的电子邮件地址是否正确,那么界面会更友好一点。答案 0 :(得分:5)
我认为这是有意义的唯一方法是在Windows Active Directory环境中。在这种情况下,您可以查询AD并查看是否存在与该用户帐户关联的电子邮件地址。这肯定适用于MS Exchange,也可以与其他企业电子邮件系统一起使用。对于.Net,您可以使用System.DirectoryServices命名空间中的类。对于Win32,您可以使用ADSI API。您必须阅读AD并创建符合您要求的合适查询。
答案 1 :(得分:3)
您是否在系统中的某处保存了电子邮件地址?没有标准的地方可供选择。我总是依赖于用户使用的应用程序(Outlook,Outlook Express,TuhunderBird)。
获取用户电子邮件地址的最佳方法是问他。
答案 2 :(得分:3)
让我通过问你这个问题回答你:你在安装Windows时输入了你的电子邮件地址吗?
答案 3 :(得分:2)
您可以尝试使用EXTENDED_NAME_FORMAT
枚举中的NameUserPrincipal
常量和GetUserNameEx
函数。
NameUserPrincipal 用户主体名称(例如someone@example.com)。
但我只建议在提示给用户时将其用作预先填写的地址。
如果信息不可用,GetLastError
的{{1}}失败的可能性很大。
答案 4 :(得分:1)
我认为简单的答案是否定的......当然,电子邮件地址将存储在他们的电子邮件程序中,例如Outlook。
你想要实现的目标是什么?
答案 5 :(得分:0)
电子邮件地址可能适用于基于网络的客户端,例如Gmail,也可能是域名电子邮件地址。无论哪种方式,实现都必须基于用户电子邮件设置的细节。所以简短的回答是“不”,至少没有“一刀切”的方法。
答案 6 :(得分:0)
Windows中可能存在一些电子邮件地址,但是为了获得用户的实际电子邮件地址,您必须让他们输入,并且为了确保它,您必须通过向他们发送激活电子邮件进行握手用它。
答案 7 :(得分:0)
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.
答案 8 :(得分:0)
我知道这是一个古老的问题,但是根据超级用户的此答案,如果您像我一样到达这里
https://superuser.com/questions/836220/get-email-address-of-current-logged-in-user
在CMD上运行whoami /upn
它提供用户主体,通常是默认电子邮件
https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/whoami