所以在過去的幾天里,我一直被 LogonUserA 困住,它總是拋出一個錯誤 1008 - ERROR_NO_TOKEN “試圖參考一個不存在的令牌。”。我傳遞給該函式的登錄型別或登錄提供程式無關緊要 - 它可以是域組態檔的互動式/網路登錄,甚至可以是本地帳戶的互動式登錄。只是總是失敗。
在我幾乎拔掉頭發后,我檢查了 LogonUserW 功能。他們都有相同的簽名,并且他們的檔案與信件完全相同。
登錄用戶A https://docs.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-logonusera
LogonUserW https://docs.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-logonuserw
這些是我的簽名
[DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
public static extern bool LogonUserA(
string lpszUsername,
string lpszDomain,
string lpszPassword,
int dwLogonType,
int dwLogonProvider,
out IntPtr phToken
);
[DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
public static extern bool LogonUserW(
string lpszUsername,
string lpszDomain,
string lpszPassword,
int dwLogonType,
int dwLogonProvider,
out IntPtr phToken
);
我也嘗試使用 phToken 作為 LogonUserA 的參考,但它沒有改變任何東西。
現在,我的問題是,有人知道其中的區別嗎?或者可能是使用 LogonUserA 時出現 1008 的原因?
謝謝!
uj5u.com熱心網友回復:
幾乎每個處理字串或文本的 Win32 函式都以“A”或“W”函式的形式存在。
- “A”函式接受
char
緩沖區中的 ANSI 文本,并用于 Windows 9x 系列 (95/98/98SE/ME),該系列在作業系統中缺乏真正的 Unicode 支持。 - “W”函式(“W”表示“Wide Character”,即 16 位)在
wchar_t
緩沖區中接受 UTF-16 文本,起源于 Windows NT 系列。- 更多細節在這里。
- “A”函式接受
一般來說,您不應該再使用“A”函式,因為如果您需要處理 Unicode 文本輸入,它們將無法作業——盡管為了向后兼容,Windows 仍然支持“A”函式。
當您
[DllImport]
在接受字串/文本輸入的 Win32 函式上使用時,您需要指定CharSet
引數:- 用于
CharSet.Ansi
“A”功能。這是您的錯誤:您錯誤地使用CharSet.Unicode
withLogonUserA
。 - 用于
CharSet.Unicode
“W”功能。 - 該
CharSet
選項意味著您不需要string
用自己的[MarshalAs( UnmanagedType.LPStr )]
或[MarshalAs( UnmanagedType.LPWStr )]
屬性(分別為“A”和“W”)注釋每個引數(以及其他編組作業......)
- 用于
此外,匯入的 Win32
BOOL
函式應另外添加注釋[return: MarshalAs(UnmanagedType.Bool)]
以確保正確處理回傳值。
因此,將您的代碼更改為:
[DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Ansi)]
[return: MarshalAs( UnmanagedType.Bool )]
public static extern bool LogonUserA(
string lpszUsername,
string? lpszDomain,
string lpszPassword,
int dwLogonType,
int dwLogonProvider,
out IntPtr phToken
);
[DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
[return: MarshalAs( UnmanagedType.Bool )]
public static extern bool LogonUserW(
string lpszUsername,
string? lpszDomain,
string lpszPassword,
int dwLogonType,
int dwLogonProvider,
out IntPtr phToken
);
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/493359.html