注册 登录
编程论坛 VFP论坛

请问如何在windows 凭据管理器中添加凭据?

sych 发布于 2022-06-23 15:39, 2792 次点击
**这个是windows 凭据管理代码,在控制面板里选凭据管理器,然后添加windows 凭据
clea
Declare Integer  CredWriteA IN Advapi32 string @PCREDENTIALA_Credential,long Flags
Declare Integer CredReadA IN Advapi32  string TargetName,long Type,long Flags,long @Credential
Declare Integer CredDeleteA  IN Advapi32 string TargetName,long Type,long  Flags
tn="192.168.10.181"
*?CredDeleteA(tn,2,0)  &&2,密码凭据,删除凭据,正确
stt=0
?CredReadA(tn,2,0,@stt)  &&读取凭据,正确,但还不会各参数分离
st2=SYS(2600,stt,1024)
?st2
?CTOBIN(SUBSTR(st2,1,4),"4rs")
?CTOBIN(SUBSTR(st2,5,4),"4rs")

?CredWriteA(?,0)  &&写入凭据,不会,请指教

retu
32 回复
#2
sych2022-06-23 17:11
typedef struct _CREDENTIALA {
  DWORD                  Flags;
  DWORD                  Type;
  LPSTR                  TargetName;
  LPSTR                  Comment;
  FILETIME               LastWritten;
  DWORD                  CredentialBlobSize;
  LPBYTE                 CredentialBlob;
  DWORD                  Persist;
  DWORD                  AttributeCount;
  PCREDENTIAL_ATTRIBUTEA Attributes;
  LPSTR                  TargetAlias;
  LPSTR                  UserName;
} CREDENTIALA, *PCREDENTIALA;
先搞懂读取
读取后个参数解析
?CTOBIN(SUBSTR(st2,1,4),"4rs")  &&好像正确
?CTOBIN(SUBSTR(st2,5,4),"4rs")  &&好像正确
剩下的就不知道怎么分离了


[此贴子已经被作者于2022-6-23 17:13编辑过]

#3
吹水佬2022-06-23 17:48
CREDENTIALA结构大小52byte,其中FILETIME占8byte,其余各占4byte
#4
sych2022-06-24 08:17
好的,谢谢,我先试试
#5
mywisdom882022-06-24 09:08
以下是引用吹水佬在2022-6-23 17:48:24的发言:

CREDENTIALA结构大小52byte,其中FILETIME占8byte,其余各占4byte

只有本站会员才能查看附件,请 登录

怎么解释这个出来。
#6
sych2022-06-24 10:01
咱们是通样的问题
#7
sych2022-06-24 10:02
我现在准备搜点资料,来个自动添加、删除、读取
#8
sych2022-06-24 12:47
Declare Integer CredReadA IN Advapi32  string TargetName,long Type,long Flags,long @Credential
tn="192.168.10.181"

stt=0
?CredReada(tn,2,0,@stt)  &&读取凭据,正确,但还不会各参数分离
st2=SYS(2600,stt,520)

?STREXTRACT(SYS(2600,CTOBIN(SUBSTR(st2,9,4),"4rs"),40),"",CHR(0))  &&位置全靠猜
?STREXTRACT(SYS(2600,CTOBIN(SUBSTR(st2,49,4),"4rs"),40),"",CHR(0))  &&位置全靠猜
?"密码不知道在哪里取"
#9
吹水佬2022-06-24 13:54
?CredReada(tn,2,0,@stt)
这句显示什么?
再看看stt是什么
?stt
#10
sych2022-06-24 14:44
这个好像更接近真相,但密码在哪里呢?
clea
DECLARE INTEGER FileTimeToLocalFileTime IN KERNEL32.DLL ;
    STRING lpFileTime, ;
    STRING @ lpLocalFileTime
DECLARE INTEGER FileTimeToSystemTime IN KERNEL32.DLL ;
    STRING lpFileTime, ;
    STRING @ lpSystemTime
Declare Integer CredReadA IN Advapi32  string TargetName,long Type,long Flags,long @Credential
tn="192.168.10.181"

stt=0
?CredReada(tn,2,0,@stt)  &&读取凭据,正确,但还不会各参数分离
st2=SYS(2600,stt,520)
?CTOBIN(SYS(2600,stt,4),"4rs")
?CTOBIN(SYS(2600,stt+4,4),"4rs")
?STREXTRACT(SYS(2600,CTOBIN(SYS(2600,stt+8,4),"4rs"),256),"",CHR(0))
*?SYS(2600,CTOBIN(SYS(2600,stt+12,4),"4rs"),100)  &&不知道这个为什么不对
lTime =REPLICATE(CHR(0),8)
FileTimeToLocalFileTime(SYS(2600,stt+16,8), @LTime)
?FTime2SysTime(LTime)
?CTOBIN(SYS(2600,stt+24,4),"4rs")
?CTOBIN(SYS(2600,stt+28,4),"4rs")
?CTOBIN(SYS(2600,stt+32,4),"4rs")
?CTOBIN(SYS(2600,stt+36,4),"4rs")
?CTOBIN(SYS(2600,stt+40,4),"4rs")
?CTOBIN(SYS(2600,stt+44,4),"4rs")
?STREXTRACT(SYS(2600,CTOBIN(SYS(2600,stt+48,4),"4rs"),256),"",CHR(0))
retu

FUNCTION FTime2SysTime
lPARAMETERS sFileTime
LOCAL sSystemTime,rc,wYear,wMonth,wDayOfWeek,wDay,wHour,wMinute,wSecond,wMilliseconds,sDateTime
sSystemTime = REPLICATE(CHR(0),16)
rc = FileTimeToSystemTime(sFileTime, @sSystemTime)
wYear         = ctobin(SUBSTR(sSystemTime, 1,2),"2rs")
wMonth        = ctobin(SUBSTR(sSystemTime, 3,2),"2rs")
wDayOfWeek    = ctobin(SUBSTR(sSystemTime, 5,2),"2rs")
wDay          = ctobin(SUBSTR(sSystemTime, 7,2),"2rs")
wHour         = ctobin(SUBSTR(sSystemTime, 9,2),"2rs")
wMinute       = ctobin(SUBSTR(sSystemTime, 11,2),"2rs")
wSecond       = ctobin(SUBSTR(sSystemTime, 13,2),"2rs")
wMilliseconds = ctobin(SUBSTR(sSystemTime, 15,2),"2rs")
sDateTime = trans(wYear) + [.] + trans(wMonth,"@l 99") + [.] + trans(wDay,"@l 99") + [ ] + ;
    trans(wHour, "@l 99") + [:] + trans(wMinute, "@l 99") + [:] + trans(wSecond, "@l 99") + [.] + trans(wMilliseconds,"@l 999")
RETURN IIF(rc=1,sDateTime,SPACE(23))

[此贴子已经被作者于2022-6-24 14:58编辑过]

#11
sych2022-06-24 14:46
回复 9楼 吹水佬
stt就是那个结构体的指针
#12
吹水佬2022-06-24 14:47
简单试了一下,好象运行正常的
程序代码:

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
#13
sych2022-06-24 15:13
回复 12楼 吹水佬
只有本站会员才能查看附件,请 登录

成功了,但你这个是添加的普通凭据,如果改成windows凭据(#define CRED_TYPE_DOMAIN_PASSWORD           2)就获取不了密码,不知道为什么
#14
吹水佬2022-06-24 15:59
回复 13楼 sych
要取的凭据是否存在?
要先保存再取出
#15
sych2022-06-24 16:07
存在的,手工添加的
另外一个问题,用你上面的代码,把类型改成2,可以添加到windows凭据,但似乎不正常,手工编辑密码后保存就正确了,估计哪里地方不对
#16
mywisdom882022-06-24 17:37
只有本站会员才能查看附件,请 登录

windows凭证,会报错误
#17
mywisdom882022-06-24 17:41
普通,凭证,建立,读,正常
但经过在WINDOWS中修改密码后,只显示密码的第1位
比如,建立的密码是123456,在windows修改密码后,654321,在读取,显示6
#18
sych2022-06-24 17:46
回复 17楼 mywisdom88
你的代码贴一下,我怎么windows凭据获取密码时的内存地址是0?
#19
mywisdom882022-06-24 17:52
#define CRED_TYPE_GENERIC                   1
就是12楼代码,把这个改成2,就出现16楼错误
#20
mywisdom882022-06-24 17:54
VFP9.0,SP1,3504版本
WIN7 64,旗舰版
#21
吹水佬2022-06-24 20:47
以下是引用mywisdom88在2022-6-24 17:41:28的发言:

普通,凭证,建立,读,正常
但经过在WINDOWS中修改密码后,只显示密码的第1位
比如,建立的密码是123456,在windows修改密码后,654321,在读取,显示6

看了一下,在windows修改密码保存的变成宽字符了,可以这样看看:
? "用户密码:", STRCONV(SYS(2600, p, CTOBIN(SYS(2600,p-4,4),"4RS")), 6)
#22
吹水佬2022-06-24 20:50
回复 16楼 mywisdom88
可能是数据有异常,得到的 p 是无效或非法的
#23
吹水佬2022-06-24 21:07
以下是引用sych在2022-6-24 15:13:36的发言:


成功了,但你这个是添加的普通凭据,如果改成windows凭据(#define CRED_TYPE_DOMAIN_PASSWORD           2)就获取不了密码,不知道为什么

CRED_TYPE_DOMAIN_PASSWORD 获取的密码地址和大小都为0,p=0时调用SYS(2600,p,...)会出错(指针无效或非法)
#24
吹水佬2022-06-25 07:49
可能是涉及密码,应该与所有者身份和权限有关,不能随便获取。

[此贴子已经被作者于2022-6-25 07:53编辑过]

#25
sych2022-06-25 08:27
回复 24楼 吹水佬
也许是的,这个也是一个安全防范机制
只有本站会员才能查看附件,请 登录
#26
sych2022-06-25 08:31
批处理也可以的
命令帮助:
创建,显示和删除保存的用户名和密码。
CMDKEY [{/add | /generic}:targetname {/smartcard | /user:username {/pass{:password}}} | /delete{:targetname | /ras} | /list{:targetname}]
示例:
要列出可用的凭据:
cmdkey /list
cmdkey /list:targetname
要创建域凭据:
cmdkey /add:targetname /user:username /pass:password
cmdkey /add:targetname /user:username /pass
cmdkey /add:targetname /user:username
cmdkey /add:targetname /smartcard
要创建普通凭据:
/add 开关可以由 /generic 替代,来创建普通凭据
要删除现有凭据:
cmdkey /delete:targetname
要删除 RAS 凭据:
cmdkey /delete /ras
————————————————
版权声明:本文为CSDN博主「大鲩鱼」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.
#27
sych2022-06-25 08:31
只要能自动添加就可以了
#28
sych2022-06-25 08:39
https://bbs.
这个网址好像有货
#29
easyppt2022-06-25 08:40
添加凭据后,还要代码实现 映射网络驱动器,WIN10能添加凭据吗? 有空试试。
另外,WIN10 映射网络驱动器  没成功,能分享一下代码吗
#30
sych2022-06-25 08:42
https://blog.
#31
easyppt2022-06-25 08:46
以下是引用sych在2022-6-25 08:39:50的发言:

https://bbs.
这个网址好像有货



我印象中我有 看雪论坛账户,尝试一下登录,竟然成功了,2006年注册的,很多年没登录了。。。。
#32
吹水佬2022-06-25 16:19
以下是引用sych在2022-6-25 08:27:50的发言:

也许是的,这个也是一个安全防范机制

看到一段相关的说法:
程序使用CredRead或CredEnumerate可以访问当前用户存储的凭据,但是读取域账户凭据时,即设置读取类型为CRED_TYPE_DOMAIN_PASSWORD,返回密码将为空。这是由于LSASS对该行为进行了限制。
#33
sych2022-06-25 16:41
那就不去管他了,目前把自动设置搞成功就可以了

[此贴子已经被作者于2022-6-25 16:42编辑过]

1