首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在凭据对话框中显示域名(使用CredUIPromptForWindowsCredentials)?

如何在凭据对话框中显示域名(使用CredUIPromptForWindowsCredentials)?
EN

Stack Overflow用户
提问于 2019-11-25 06:54:21
回答 1查看 634关注 0票数 0

我使用mydomain\UserName来获取用户凭据,但是如果用户编写像下面这样的UserName@mydomain.local.或CredUIPromptForWindowsCredentials登录,那么凭据对话框就不会显示域名如何在凭证对话框中显示域名?

代码语言:javascript
复制
public static NetworkCredential ShowCredDialog(string caption, string message, NetworkCredential defaultCreds = null)
{
    var credui = new CREDUI_INFO
    {
        pszCaptionText = caption,
        pszMessageText = message,
    };
    credui.cbSize = Marshal.SizeOf(credui);

    uint authPackage = 0;
    var save = false;

    CreateInAuthBuffer(defaultCreds, out var inAuthBuffer, out var inAuthSize);

    var result = CredUIPromptForWindowsCredentials(
        ref credui,
        0,
        ref authPackage,
        inAuthBuffer,
        (uint)inAuthSize,
        out var outCredBuffer,
        out var outCredSize,
        ref save,
        1 /* Generic */);

    if (result != 0)
    {
        return null;
    }

    var maxUserName = 100;
    var maxDomain = 100;
    var maxPassword = 100;
    var usernameBuf = new StringBuilder(maxUserName);
    var domainBuf = new StringBuilder(maxDomain);
    var passwordBuf = new StringBuilder(maxPassword);

    var packAuthRes = CredUnPackAuthenticationBuffer(0, outCredBuffer, outCredSize,
        usernameBuf, ref maxUserName,
        domainBuf, ref maxDomain,
        passwordBuf, ref maxPassword);

    var userName = usernameBuf.ToString();
    var domain = domainBuf.ToString();
    var password = passwordBuf.ToString();

    CoTaskMemFree(outCredBuffer);

    return new NetworkCredential
    {
        UserName = userName,
        Domain = domain,
        Password = password,
    };
}

[DllImport("credui.dll", CharSet = CharSet.Auto)]
private static extern int CredUIPromptForWindowsCredentials(ref CREDUI_INFO notUsedHere,
    int authError,
    ref uint authPackage,
    IntPtr InAuthBuffer,
    uint InAuthBufferSize,
    out IntPtr refOutAuthBuffer,
    out uint refOutAuthBufferSize,
    ref bool fSave,
    int flags);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-23 11:46:18

我需要更改参数:-在CredUIPromptForWindowsCredentials set dwFlags to 0x10 CREDUIWIN_AUTHPACKAGE_ONLY CredUIPromptForWindowsCredentials函数分解 - in CredUnPackAuthenticationBuffer set dwFlags to 0x01 (解密) CredUnPackAuthenticationBuffer函数分解

代码语言:javascript
复制
...
var result = CredUIPromptForWindowsCredentials(
                ref credui,
                0,
                ref authPackage,
                inAuthBuffer,
                (uint)inAuthSize,
                out var outCredBuffer,
                out var outCredSize,
                ref save,
                0x10/*CREDUIWIN_AUTHPACKAGE_ONLY*/);
...
var packAuthRes = CredUnPackAuthenticationBuffer(
                1, outCredBuffer, outCredSize,
                usernameBuf, ref maxUserName,
                domainBuf, ref maxDomain,
                passwordBuf, ref maxPassword);
...
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59026610

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档