错误 31 - 从 VBA 宏调用 CredUIPromptForWindowsCredentialW [英] Error 31 - Calling CredUIPromptForWindowsCredentialW from VBA macro
问题描述
我最近问过这个问题,但由于信息不足而删除了.我会尝试再次询问,希望提供更多信息.
I recently asked this question but deleted due to insufficient information. I will attempt to ask it again hopefully with more information.
我正在尝试调用 Win32 API 函数 CredUIPromptForWindowsCredentialsW()
但过去两天一直失败.
I am trying to call the Win32 API function CredUIPromptForWindowsCredentialsW()
but have been failing for the past two days.
我也读过一些帖子,例如:
I have also read a few posts, such as:
我最后的代码是我认为应该为调用定义所有参数的方式,但是这会返回错误代码 31:
My code at the end is how I think all of the parameters should be defined for the call, however this returns error code 31:
ERROR_GEN_FAILURE
ERROR_GEN_FAILURE
31 (0x1F)
连接到系统的设备无法正常工作.
A device attached to the system is not functioning.
Public Declare PtrSafe Function CredUIPromptForWindowsCredentials Lib "credui" Alias "CredUIPromptForWindowsCredentialsW" ( _
ByRef pUiInfo As CREDUI_INFO, _
ByVal dwAuthError As LongPtr, _
ByRef pulAuthPackage As LongPtr, _
ByVal pvInAuthBuffer As Long, _
ByRef ulInAuthBufferSize As LongPtr, _
ByVal ppvOutAuthBuffer As Long, _
ByRef pulOutAuthBufferSize As LongPtr, _
ByVal iSave As Long, _
ByVal dwFlags As Long) _
As Long
Public Declare PtrSafe Function CredUnPackAuthenticationBuffer Lib "credui" Alias "CredUnPackAuthenticationBufferW" ( _
ByRef dwFlags As LongPtr, _
ByRef pAuthBuffer As LongPtr, _
ByRef cbAuthBuffer As LongPtr, _
ByRef pszUserName As LongPtr, _
ByRef pcchMaxUserName As LongPtr, _
ByRef pszDomainName As LongPtr, _
ByRef pcchMaxDomainName As LongPtr, _
ByRef pszPassword As LongPtr, _
ByRef pcchMaxPassword As LongPtr) _
As LongPtr
Public Enum CREDUI_FLAGS
INCORRECT_PASSWORD = &H1
DO_NOT_PERSIST = &H2
REQUEST_ADMINISTRATOR = &H4
EXCLUDE_CERTIFICATES = &H8
REQUIRE_CERTIFICATE = &H10
SHOW_SAVE_CHECK_BOX = &H40
ALWAYS_SHOW_UI = &H80
REQUIRE_SMARTCARD = &H100
PASSWORD_ONLY_OK = &H200
VALIDATE_USERNAME = &H400
COMPLETE_USERNAME = &H800
PERSIST = &H1000
SERVER_CREDENTIAL = &H4000
EXPECT_CONFIRMATION = &H20000
GENERIC_CREDENTIALS = &H40000
USERNAME_TARGET_CREDENTIALS = &H80000
KEEP_USERNAME = &H100000
End Enum
Private Const BUFFER_SIZE As Integer = &H100
Private Const ERROR_CANCELLED As Integer = &H4C7
Private Const CREDUIWIN_GENERIC As Integer = &H1
Private Const CREDUIWIN_CHECKBOX As Integer = &H2
Private Const CREDUIWIN_ENUMERATE_CURRENT_USER As Integer = &H200
Private Const CREDUIWIN_IN_CRED_ONLY As Integer = &H20
Private Const CREDUIWIN_AUTHPACKAGE_ONLY As Integer = &H10
Private Const CREDUIWIN_ENUMERATE_ADMINS As Integer = &H100
Private Const CRED_PACK_PROTECTED_CREDENTIALS As Integer = &H1
Private Const CRED_PACK_GENERIC_CREDENTIALS As Integer = &H4
Private Const MAX_USER_NAME As Integer = 100
Private Const MAX_PASSWORD As Integer = 100
Private Const MAX_DOMAIN As Integer = 100
Public Type CREDUI_INFO
cbSize As Long
hwndParent As Long
pszMessageText As LongPtr
pszCaptionText As LongPtr
hbmBanner As Long
End Type
Public Function GetCredentials()
Dim pUiInfo As CREDUI_INFO
Dim pulAuthPackage As LongPtr
Dim iSave As Long
Dim result As Long
Dim dwFlags As Long
Dim ulInAuthBufferSize As LongPtr
Dim pulOutAuthBufferSize As LongPtr
Dim pvInAuthBuffer As Long
Dim ppvOutAuthBuffer As Long
pUiInfo.cbSize = LenB(pUiInfo)
pUiInfo.hwndParent = 0
pUiInfo.pszMessageText = StrPtr("message")
pUiInfo.pszCaptionText = StrPtr("title")
pulAuthPackage = 0
iSave = 0
dwFlags = CREDUIWIN_CHECKBOX + CREDUIWIN_ENUMERATE_CURRENT_USER + CREDUIWIN_ENUMERATE_ADMINS
ppvOutAuthBuffer = 0
pvInAuthBuffer = 0
ulInAuthBufferSize = 0
pulOutAuthBufferSize = 0
result = CredUIPromptForWindowsCredentials( _
pUiInfo, _
0, _
authPackage, _
pvInAuthBuffer, _
ulInAuthBufferSize, _
ppvOutAuthBuffer, _
pulOutAuthBufferSize, _
iSave, _
dwFlags)
MsgBox result
End Function
此代码现在返回 31 错误代码,感谢评论部分指出我的声明中的一些更改.它不再崩溃,但错误 31 是我现在收到的.
This code now returns 31 error code, with thanks to the comment section for pointing out some changes in my declarations. It no longer crashes word, but the Error 31 is what I receive now.
推荐答案
'
' CREDUIAPI DWORD CredUIPromptForWindowsCredentialsW(
' PCREDUI_INFOW pUiInfo,_
' DWORD dwAuthError,
' ULONG *pulAuthPackage,
' LPCVOID pvInAuthBuffer,
' ULONG ulInAuthBufferSize,
' LPVOID *ppvOutAuthBuffer,
' ULONG *pulOutAuthBufferSize,
' BOOL *pfSave,
' DWORD dwFlags
');
'
Public Declare PtrSafe Function CredUIPromptForWindowsCredentials Lib "credui" Alias "CredUIPromptForWindowsCredentialsW" ( _
ByRef pUiInfo As CREDUI_INFO, _
ByVal dwAuthError As Long, _
ByRef pulAuthPackage As LongPtr, _
ByVal pvInAuthBuffer As Any, _
ByVal ulInAuthBufferSize As Long, _
ByRef ppvOutAuthBuffer As Any, _
pulOutAuthBufferSize As LongPtr, _
ByRef iSave As Long, _
ByVal dwFlags As Long) _
As Long
Public Declare PtrSafe Function CredUnPackAuthenticationBuffer Lib "credui" Alias "CredUnPackAuthenticationBufferW" ( _
ByRef dwFlags As LongPtr, _
ByRef pAuthBuffer As LongPtr, _
ByRef cbAuthBuffer As LongPtr, _
ByRef pszUserName As LongPtr, _
ByRef pcchMaxUserName As LongPtr, _
ByRef pszDomainName As LongPtr, _
ByRef pcchMaxDomainName As LongPtr, _
ByRef pszPassword As LongPtr, _
ByRef pcchMaxPassword As LongPtr) _
As LongPtr
Public Enum CREDUI_FLAGS
INCORRECT_PASSWORD = &H1
DO_NOT_PERSIST = &H2
REQUEST_ADMINISTRATOR = &H4
EXCLUDE_CERTIFICATES = &H8
REQUIRE_CERTIFICATE = &H10
SHOW_SAVE_CHECK_BOX = &H40
ALWAYS_SHOW_UI = &H80
REQUIRE_SMARTCARD = &H100
PASSWORD_ONLY_OK = &H200
VALIDATE_USERNAME = &H400
COMPLETE_USERNAME = &H800
PERSIST = &H1000
SERVER_CREDENTIAL = &H4000
EXPECT_CONFIRMATION = &H20000
GENERIC_CREDENTIALS = &H40000
USERNAME_TARGET_CREDENTIALS = &H80000
KEEP_USERNAME = &H100000
End Enum
Private Const BUFFER_SIZE As Integer = &H100
Private Const ERROR_CANCELLED As Integer = &H4C7
Private Const CREDUIWIN_GENERIC As Integer = &H1
Private Const CREDUIWIN_CHECKBOX As Integer = &H2
Private Const CREDUIWIN_ENUMERATE_CURRENT_USER As Integer = &H200
Private Const CREDUIWIN_IN_CRED_ONLY As Integer = &H20
Private Const CREDUIWIN_AUTHPACKAGE_ONLY As Integer = &H10
Private Const CREDUIWIN_ENUMERATE_ADMINS As Integer = &H100
Private Const CRED_PACK_PROTECTED_CREDENTIALS As Integer = &H1
Private Const CRED_PACK_GENERIC_CREDENTIALS As Integer = &H4
Private Const MAX_USER_NAME As Integer = 100
Private Const MAX_PASSWORD As Integer = 100
Private Const MAX_DOMAIN As Integer = 100
'typedef struct _CREDUI_INFOA {
' DWORD cbSize;
' HWND hwndParent;
' PCSTR pszMessageText;
' PCSTR pszCaptionText;
' HBITMAP hbmBanner;
'} CREDUI_INFOA, *PCREDUI_INFOA;
Public Type CREDUI_INFO
cbSize As Long
hwndParent As LongPtr
pszMessageText As LongPtr
pszCaptionText As LongPtr
hbmBanner As Long
End Type
Public Function GetCredentials()
Dim pUiInfo As CREDUI_INFO
Dim pulAuthPackage As LongPtr
Dim iSave As Long
Dim result As Long
Dim dwFlags As Long
Dim ulInAuthBufferSize As Long
Dim pulOutAuthBufferSize As LongPtr
Dim pvInAuthBuffer As LongPtr
Dim ppvOutAuthBuffer As LongPtr
pUiInfo.cbSize = LenB(pUiInfo)
pUiInfo.hwndParent = 0
pUiInfo.pszMessageText = StrPtr("message")
pUiInfo.pszCaptionText = StrPtr("title")
pulAuthPackage = 0
iSave = 0
dwFlags = CREDUIWIN_CHECKBOX + CREDUIWIN_ENUMERATE_CURRENT_USER + CREDUIWIN_ENUMERATE_ADMINS
ppvOutAuthBuffer = 0
pvInAuthBuffer = 0
ulInAuthBufferSize = 0
pulOutAuthBufferSize = 0
result = CredUIPromptForWindowsCredentials( _
pUiInfo, _
0, _
authPackage, _
pvInAuthBuffer, _
ulInAuthBufferSize, _
ppvOutAuthBuffer, _
pulOutAuthBufferSize, _
iSave, _
dwFlags)
MsgBox result
End Function
感谢 Anders,我现在可以使用它,最后的更改是将 HWND 设置为 LongPtr,完成上面的代码.
Thanks to Anders I got it working now with the final change being HWND set to a LongPtr, Finished code above.
这篇关于错误 31 - 从 VBA 宏调用 CredUIPromptForWindowsCredentialW的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!