标题:请问如何在windows 凭据管理器中添加凭据?
只看楼主
sych
Rank: 3Rank: 3
等 级:论坛游侠
威 望:6
帖 子:179
专家分:183
注 册:2019-10-11
得分:0 
回复 9楼 吹水佬
stt就是那个结构体的指针
2022-06-24 14:46
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:20 
简单试了一下,好象运行正常的
程序代码:
DECLARE long CredWriteA  IN advapi32 as apiCredWrite  string@,long
DECLARE long CredReadA   IN advapi32 as apiCredRead   string@,long,long,long@
DECLARE long CredFree    IN advapi32 as apiCredFree   long

DECLARE long _strdup   IN msvcrt as apiStrdup    string
DECLARE long free      IN msvcrt as apiFree      long
DECLARE long strlen    IN msvcrt as apiStrlen    long
  
#define CRED_TYPE_GENERIC                   1
#define CRED_TYPE_DOMAIN_PASSWORD           2
#define CRED_TYPE_DOMAIN_CERTIFICATE        3
#define CRED_TYPE_DOMAIN_VISIBLE_PASSWORD   4
#define CRED_TYPE_MAXIMUM                   5
#define CRED_TYPE_MAXIMUM_EX                (CRED_TYPE_MAXIMUM+1000)

#define CRED_PERSIST_NONE           0
#define CRED_PERSIST_SESSION        1
#define CRED_PERSIST_LOCAL_MACHINE  2
#define CRED_PERSIST_ENTERPRISE     3

? SaveCred("myTarget", "张三", "abc123")
? ReadCred("myTarget")

FUNCTION SaveCred(cTargetName, cUserName, cPassword)
    pTargetName = apiStrdup(cTargetName)
    pUserName   = apiStrdup(cUserName)
    pPassword   = apiStrdup(cPassword)
    ** CREDENTIALA 结构
    cred = 0h00000000;
         + BINTOC(CRED_TYPE_GENERIC, "4RS");            && Type
         + BINTOC(pTargetName, "4RS");                  && TargetName
         + REPLICATE(0h00, 12);
         + BINTOC(apiStrlen(pPassword), "4RS");         && CredentialBlobSize
         + BINTOC(pPassword, "4RS");                    && CredentialBlob
         + BINTOC(CRED_PERSIST_LOCAL_MACHINE, "4RS");   && Persist
         + REPLICATE(0h00, 12);
         + BINTOC(pUserName, "4RS")                     && UserName
    ret = apiCredWrite(@cred, 0)    
    apiFree(pTargetName)     
    apiFree(pUserName)
    apiFree(pPassword)
    RETURN ret != 0
ENDFUNC

FUNCTION ReadCred(cTargetName)
    pCred = 0
    IF apiCredRead(@cTargetName, CRED_TYPE_GENERIC, 0, @pCred) == 0
        RETURN .F.
    ENDIF
    p = CTOBIN(SYS(2600,pCred+8,4),"4RS")
    ? "凭据名称:", SYS(2600, p, apiStrlen(p))
    p = CTOBIN(SYS(2600,pCred+48,4),"4RS")
    ? "用户名称:", SYS(2600, p, apiStrlen(p))
    p = CTOBIN(SYS(2600,pCred+28,4),"4RS")
    ? "用户密码:", SYS(2600, p, apiStrlen(p))
    ?
    apiCredFree(pCred)
    RETURN .T.
ENDFUNC
2022-06-24 14:47
sych
Rank: 3Rank: 3
等 级:论坛游侠
威 望:6
帖 子:179
专家分:183
注 册:2019-10-11
得分:0 
回复 12楼 吹水佬

成功了,但你这个是添加的普通凭据,如果改成windows凭据(#define CRED_TYPE_DOMAIN_PASSWORD           2)就获取不了密码,不知道为什么
2022-06-24 15:13
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
回复 13楼 sych
要取的凭据是否存在?
要先保存再取出
2022-06-24 15:59
sych
Rank: 3Rank: 3
等 级:论坛游侠
威 望:6
帖 子:179
专家分:183
注 册:2019-10-11
得分:0 
存在的,手工添加的
另外一个问题,用你上面的代码,把类型改成2,可以添加到windows凭据,但似乎不正常,手工编辑密码后保存就正确了,估计哪里地方不对
2022-06-24 16:07
mywisdom88
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:190
帖 子:3125
专家分:8340
注 册:2015-3-25
得分:0 

windows凭证,会报错误
2022-06-24 17:37
mywisdom88
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:190
帖 子:3125
专家分:8340
注 册:2015-3-25
得分:0 
普通,凭证,建立,读,正常
但经过在WINDOWS中修改密码后,只显示密码的第1位
比如,建立的密码是123456,在windows修改密码后,654321,在读取,显示6
2022-06-24 17:41
sych
Rank: 3Rank: 3
等 级:论坛游侠
威 望:6
帖 子:179
专家分:183
注 册:2019-10-11
得分:0 
回复 17楼 mywisdom88
你的代码贴一下,我怎么windows凭据获取密码时的内存地址是0?
2022-06-24 17:46
mywisdom88
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:190
帖 子:3125
专家分:8340
注 册:2015-3-25
得分:0 
#define CRED_TYPE_GENERIC                   1
就是12楼代码,把这个改成2,就出现16楼错误
2022-06-24 17:52
mywisdom88
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:190
帖 子:3125
专家分:8340
注 册:2015-3-25
得分:0 
VFP9.0,SP1,3504版本
WIN7 64,旗舰版
2022-06-24 17:54



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-509405-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.101721 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved