我正在尝试获取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
下面是我的代码:
#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,消息:密钥表中没有与所需名称匹配的主体
如何修复此错误?
发布于 2016-01-16 08:37:32
您可能误解了API。使用GSS_C_NT_HOSTBASED_SERVICE导入的服务器名是您的目标服务器。gss_acquire_cred需要一个initiate crdential。accept用于服务器/服务。服务仅与密钥表一起工作,客户端与缓存或客户端密钥表一起工作。由于您拥有用户主体的有效凭据缓存,因此您希望使用客户端redential启动上下文。
https://stackoverflow.com/questions/34597875
复制相似问题