获取ie自动保存用户名密码

IPStore接口获取IE自动保存的用户名密码(最后一句怎么修改):

//动态加载pstorec.dll,得到PStoreCreateInstance函数地址

typedef HRESULT (WINAPI tPStoreCreateInstance)(IPStore *, DWORD, DWORD, DWORD);
HMODULE hpsDLL;
hpsDLL = LoadLibrary("pstorec.dll");

tPStoreCreateInstance pPStoreCreateInstance;
pPStoreCreateInstance = (tPStoreCreateInstance)GetProcAddress(hpsDLL, "PStoreCreateInstance");

IPStorePtr PStore;
HRESULT hRes = pPStoreCreateInstance(&PStore, 0, 0, 0);

IEnumPStoreTypesPtr EnumPStoreTypes;
hRes = PStore->EnumTypes(0, 0, &EnumPStoreTypes);//指定枚举区域

if (!FAILED(hRes))
{
GUID TypeGUID;
char szItemName[512];

char szItemData[512];
char szResName[1512];
char szResData[512];
char szItemGUID[50];

//枚举密码类型
HRESULT hr=EnumPStoreTypes->raw_Next(0,&TypeGUID,0);

最后一行总出错(可以编译通过,但hr值不对),跟踪发现raw_Next()函数运行出错了,求大侠们指点,应如何改正(Win7系统)。

该回答引用ChatGPT

根据你提供的代码,似乎缺少了一个循环来遍历枚举出来的密码类型。在枚举类型后,应该使用一个循环遍历每个密码类型,然后获取每个密码类型中的密码项。以下是一个修改建议,可以尝试使用:

//枚举密码类型
while (SUCCEEDED(EnumPStoreTypes->raw_Next(1, &TypeGUID, NULL)))
{
    IEnumPStoreTypesPtr EnumPStoreItems;
    hRes = PStore->EnumItems(&TypeGUID, NULL, NULL, 0, &EnumPStoreItems);
    if (!FAILED(hRes))
    {
//遍历密码项
        while (SUCCEEDED(EnumPStoreItems->raw_Next(1, &szItemGUID, NULL)))
        {
//获取密码项名称
            hRes = PStore->ReadItem(&TypeGUID, szItemGUID, szResData, sizeof(szResData), &szItemName, sizeof(szItemName), 0);
            if (!FAILED(hRes))
            {
//处理密码项名称
//...

                //获取密码项数据
                hRes = PStore->ReadItem(&TypeGUID, szItemGUID, szResData, sizeof(szResData), NULL, 0, 0);
                if (!FAILED(hRes))
                {
                    //处理密码项数据
                    //...
                }
            }
        }
    }
}

此外,请注意,使用IPStore接口来获取密码可能会存在以下限制和问题:

  • 该接口只能获取IE浏览器自动保存的密码,不能获取其他应用程序(如Chrome、Firefox等)保存的密码。
  • 如果用户已经关闭了IE浏览器的自动保存密码功能,那么无法获取密码。
  • 获取密码需要使用高权限,可能需要管理员权限或者特殊权限,因此在实际使用时需要格外小心,以防止出现安全问题。
  • 这种方法可能会在未来的IE版本中被修改或禁用,因此不建议在生产环境中使用。