首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Windows上的gss_acquire_cred

Windows上的gss_acquire_cred
EN

Stack Overflow用户
提问于 2016-01-05 02:53:46
回答 1查看 453关注 0票数 0

我正在尝试获取Windows主机上管理员的凭据。我在mingw64_shell之下。

这是我的证书:

$ klist凭据缓存:文件:/tmp/krb5cc_1049076主体: Administrator@CORP.PEROKSID.COM

颁发期限主体Jan 4 2016 10:14:07 2016 Jan 4 20:14:07 2016 krbtgt/CORP.PEROKSID.COM@CORP.PEROKSID.COM

下面是我的代码:

代码语言:javascript
复制
#include <stdio.h>
#include <string.h>
#include <gss.h>

static void doDisplay(const char *m,OM_uint32 code,int type)
{
    OM_uint32 maj_stat, min_stat;
    gss_buffer_desc msg;
    OM_uint32 msg_ctx;

    msg_ctx = 0;
    while (1)
    {
        maj_stat = gss_display_status(&min_stat, code,
                                      type, GSS_C_NULL_OID,
                                      &msg_ctx, &msg);
        printf("GSS-API error %s - type: %s code: %d, msg: %s\n", m,
             type == GSS_C_GSS_CODE ? "major" : "minor",
             code,
             (char *)msg.value);
        gss_release_buffer(&min_stat, &msg);

        if (!msg_ctx)
            break;
    }
}

void displayError(const char *msg, OM_uint32 maj_stat, OM_uint32 min_stat)
{
    doDisplay(msg, maj_stat, GSS_C_GSS_CODE);
    doDisplay(msg, min_stat, GSS_C_MECH_CODE);
}



int getCreds(const char *service_name, gss_cred_id_t *server_creds)
{
    printf ("Test name: %s\n", service_name);
    gss_buffer_desc name_buf;
    gss_name_t server_name;
    OM_uint32 maj_stat, min_stat;

    name_buf.value = service_name;
    //name_buf.length = strlen(name_buf.value) + 1;
    name_buf.length = strlen(name_buf.value);
    maj_stat = gss_import_name(&min_stat, &name_buf,
                               (gss_OID) GSS_C_NT_HOSTBASED_SERVICE, &server_name);
    if (maj_stat != GSS_S_COMPLETE)
    {
        displayError("importing name", maj_stat, min_stat);
        return -1;
    }
    maj_stat = gss_acquire_cred(&min_stat, server_name, 0,
                                GSS_C_NULL_OID_SET, GSS_C_ACCEPT,
                                server_creds, NULL, NULL);

    if (maj_stat != GSS_S_COMPLETE)
    {
        displayError("acquiring credentials", maj_stat, min_stat);
        return -1;
    }

    (void) gss_release_name(&min_stat, &server_name);

    return 0;
}

int main(int argc, char** argv) {
        gss_cred_id_t gsscreds;
        if(getCreds(argv[1], &gsscreds) != 0)
                return 1;
}

我已经将它编译为a.exe。我运行它:

$ ./a.exe ' Administrator@CORP.PEROKSID.COM‘测试名称:Administrator@CORP.PEROKSID.COM GSS-API获取凭据时出错-类型:主要代码: 458752,消息:未提供凭据,或者凭据不可用或无法访问GSS-API获取凭据时出错-类型:次要代码: 11,消息:密钥表中没有与所需名称匹配的主体

如何修复此错误?

EN

回答 1

Stack Overflow用户

发布于 2016-01-16 08:37:32

您可能误解了API。使用GSS_C_NT_HOSTBASED_SERVICE导入的服务器名是您的目标服务器。gss_acquire_cred需要一个initiate crdential。accept用于服务器/服务。服务仅与密钥表一起工作,客户端与缓存或客户端密钥表一起工作。由于您拥有用户主体的有效凭据缓存,因此您希望使用客户端redential启动上下文。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34597875

复制
相关文章

相似问题

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