Excel VBA Selenium:能否调用Edge已保存的账号密码填充字段?
能否通过VBA调用Edge保存的账号密码填充Excel字段?
可以实现,但存在关键限制,以下是具体说明和可行方案:
核心限制
Edge的密码存储在加密SQLite数据库(Windows路径为%LOCALAPPDATA%\Microsoft\Edge\User Data\Default\Login Data)中,且受Windows Credential Locker保护,普通VBA无法直接读取解密。微软也未公开官方API供VBA直接访问Edge保存的密码,任何读取操作都依赖非官方方法,存在兼容性和安全风险。
可行替代方案
1. 读取Windows凭据管理器中的同步凭据
如果数据提供商的登录信息已被Edge同步到Windows凭据管理器,可通过VBA调用Windows API读取:
Declare PtrSafe Function CredRead Lib "advapi32.dll" Alias "CredReadA" _ (ByVal TargetName As String, ByVal Type As Long, ByVal Reserved As Long, _ ByRef Credential As LongPtr) As Boolean Declare PtrSafe Function CredFree Lib "advapi32.dll" _ (ByVal Credential As LongPtr) As Boolean Declare PtrSafe Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" _ (Destination As Any, Source As Any, ByVal Length As Long) Type CREDENTIAL Flags As Long Type As Long TargetName As String Comment As String LastWritten As FILETIME CredentialBlobSize As Long CredentialBlob As LongPtr Persist As Long AttributeCount As Long Attributes As LongPtr TargetAlias As String UserName As String End Type Type FILETIME dwLowDateTime As Long dwHighDateTime As Long End Type Sub GetSyncedCredential() Dim cred As CREDENTIAL Dim credPtr As LongPtr Dim username As String Dim password As String ' 替换为数据提供商的登录域名/标识,需和凭据管理器中一致 If CredRead("https://your-provider-domain.com", 1, 0, credPtr) Then CopyMemory cred, ByVal credPtr, LenB(cred) username = cred.UserName ' 读取密码内容 password = String(cred.CredentialBlobSize, 0) CopyMemory ByVal password, ByVal cred.CredentialBlob, cred.CredentialBlobSize CredFree credPtr ' 填充到Excel指定单元格 Range("A1").Value = username Range("B1").Value = password Else MsgBox "未找到匹配的凭据" End If End Sub
注意:代码需根据Office位数(32/64位)调整
PtrSafe声明,且Excel需以管理员权限运行才能访问凭据管理器。
2. 自动化Edge浏览器完成填充
通过VBA控制Edge浏览器,利用其自带的自动填充功能完成登录,再读取填充后的字段值:
Sub AutoFillViaEdge() Dim edgeApp As Object Set edgeApp = CreateObject("MicrosoftEdge.Application") edgeApp.Visible = True edgeApp.Navigate "https://your-provider-login-page.com" ' 等待页面加载完成 Do While edgeApp.Busy Or edgeApp.ReadyState <> 4 DoEvents Loop ' 等待Edge自动填充完成(需确保浏览器已开启自动填充功能) Application.Wait Now + TimeValue("00:00:02") ' 读取填充后的用户名和密码 Dim usernameBox As Object Set usernameBox = edgeApp.Document.GetElementById("username") ' 替换为实际用户名框ID If Not usernameBox Is Nothing Then Range("A1").Value = usernameBox.Value End If Dim passwordBox As Object Set passwordBox = edgeApp.Document.GetElementById("password") ' 替换为实际密码框ID If Not passwordBox Is Nothing Then Range("B1").Value = passwordBox.Value End If ' 可选:执行登录操作 ' edgeApp.Document.GetElementById("login-button").Click End Sub
此方法依赖Edge的自动填充设置开启,且需准确匹配页面元素的ID或选择器。
安全建议
- 优先使用Windows凭据管理器或浏览器自动化方案,避免直接处理明文密码。
- 确保Excel文件启用宏保护,仅授权可信用户访问。
内容的提问来源于stack exchange,提问作者G. Asins
相关产品推荐
相关产品推荐

