如何验证NT帐号?(再加100分) (200分)

  • 主题发起人 主题发起人 ShaLong
  • 开始时间 开始时间
S

ShaLong

Unregistered / Unconfirmed
GUEST, unregistred user!
已知: User Name、Password、Domain,如何验证该User为该Domain的合法User?
 
使用LogonUser看能不能成功。(仅能在nt下使用
不能在win9x上使用)
 
我试过LogonUser,但总是不能成功,好象此函数需要特定的权限。有没有其它
的方法呢?
 
目前好象只能使用LogonUser,如果你熟悉LSA API的话或许LSA好用一些,但太复杂了。
进程调用LogonUser需要有SE_TCB_NAME特权,在特定情况下也需要
SE_CHANGE_NOTIFY_NAME特权。

获得特权可以参考下面的示例:

if( !OpenProcessToken(
GetCurrentProcess(),
TOKEN_QUERY | TOKEN_ADJUST_DEFAULT | TOKEN_ADJUST_GROUPS | TOKEN_ADJUST_PRIVILEGES,
&hProcessToken ) )
// Error Process;

if( !LookupPrivilegeValueA( NULL, lpPrivilegeName, &(tp.Privileges[0].Luid) ) )
// Error Process;

tp.PrivilegeCount = 1;
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

if( !AdjustTokenPrivileges(
hProcessToken,
FALSE,
&tp,
sizeof(TOKEN_PRIVILEGES) + sizeof( LUID_AND_ATTRIBUTES ) * 2,
NULL,
NULL ) )
// Error Process;

CloseHandle( hProcessToken );

当然了,启动进程的帐号也要有相应的特权,可以使用用户管理器设定,或通过
程序设定,类似上面的代码。
 
啊,啊,这个问题,以前我在论坛问过,但没人回答上来,最后,自己解决了。
用LogonUser函数,但只能在NT服务器用,我是把它做在中间层上的一个函数的。
 
补充:
Procedure Login(sUserID:WideString;sAPassWord):Boolean;
var
sAID:String;
LL:Handle;
begin
sAID:=sUerID;//重点Pchar不支持WideString
sDomainName:=....//读取注册表

Flag:=LogonUser(pchar(sAID),pchar(sDomainName),pchar(sAPassWord),LOGON32_LOGON_NETWORK,LOGON32_PROVIDER_DEFAULT,LL);
If not Flag then
begin
Result:=False
else
Result:=True;
 
LogonUser好象行不通!因为普通Domain User没有相应的Privilege。
我们知道,无论是在Win98还是在WinNT上,在我们Key in 正确的
User ID和Password,Windows都可以让我们Logon相应Doamin,
而且在Win98上,还有WNetVerifyPassword函数来验证User的
Password!望各位大侠再帮小弟想一想!
 
ShaLong:如果你还要继续讨论请定期提前你的帖子,如果不想继续讨论请结束帖子。
 
多人接受答案了。
 
后退
顶部