局域网电脑用户都加入了域,要求传入传入域用户名密码,检验是否正确。请问高手要怎么做?

解决方案 »

  1.   

    想做一个象windows启动时的登录框一样的东西,传入域的用户名和密码,验证是否正确
    想知道用什么API可以实现
      

  2.   

    unit UserPro_Logon;interface
      uses
        Windows;  function AdjustToken:Boolean;
      function PerformLogon(const User,Domain, Password: String;var ErrorCode:integer): Cardinal;
      function Logonwindows(const User, Password: String;Var ErrCode:Integer):Boolean;
      
    implementationfunction AdjustToken:Boolean;
    var
      hdlProcessHandle : Cardinal;
      hdlTokenHandle : Cardinal;
      tmpLuid : Int64;
      tkpPrivilegeCount : Int64;
      tkp : TOKEN_PRIVILEGES;
      tkpNewButIgnored : TOKEN_PRIVILEGES; 
      lBufferNeeded : Cardinal;
      Privilege : array[0..0] of _LUID_AND_ATTRIBUTES;
      hToken:THandle;
    begin
      hdlProcessHandle := GetCurrentProcess;
      {OpenProcessToken(hdlProcessHandle,
                      (TOKEN_ADJUST_PRIVILEGES Or TOKEN_QUERY),
                        hdlTokenHandle);
      }
      //TOKEN_QUERY | TOKEN_ADJUST_DEFAULT | TOKEN_ADJUST_GROUPS | TOKEN_ADJUST_PRIVILEGES  OpenProcessToken(hdlProcessHandle,
                       (TOKEN_QUERY or TOKEN_ADJUST_DEFAULT or TOKEN_ADJUST_GROUPS or TOKEN_ADJUST_PRIVILEGES),
                       hdlTokenHandle);  LookupPrivilegeValue(nil, 'SeTcbPrivilege', tmpLuid);
      Privilege[0].Luid := tmpLuid;
      Privilege[0].Attributes := SE_PRIVILEGE_ENABLED; 
      tkp.PrivilegeCount := 1;  // One privilege to set
      tkp.Privileges[0] := Privilege[0];  if
      AdjustTokenPrivileges(hdlTokenHandle,
                            False,
                            tkp,
                            Sizeof(tkpNewButIgnored),
                            tkpNewButIgnored,
                            lBufferNeeded) then
      Result:=True
      else
      Result:=False;
    end;
    //------------------------------------------------------------------------------function PerformLogon(const User,Domain, Password: String;var ErrorCode:integer): Cardinal;
    begin
      if NOT LogonUser(pChar(User), pChar(Domain), pChar(Password),
                   LOGON32_LOGON_INTERACTIVE,//LOGON32_LOGON_NETWORK,
                   LOGON32_PROVIDER_DEFAULT,
                   Result) then
      ErrorCode:=getLastError
      else
      ErrorCode:=0;
    end;
    //------------------------------------------------------------------------------
    function Logonwindows(const User, Password: String;Var ErrCode:Integer):Boolean;
    var
      hToken: Cardinal;
    begin
        if not AdjustToken then Exit;
        hToken := PerformLogon(User,'.',PassWord,ErrCode);
        try
            ImpersonateLoggedOnUser(hToken);
            try        finally
                RevertToSelf;
            end;
            Result:=(ErrCode=0);
        finally
            CloseHandle(hToken);
        end;
    end;
    //-----------------------------------------------------------------------------
    end.http://lysoft.7u7.net
      

  3.   

    问一下 ly_liuyang(Liu Yang) 
     hToken := PerformLogon(User,'.',PassWord,ErrCode);
    里面的‘.’做domain的参数,表示什么?
      

  4.   

    程序运行后,
    function Logonwindows(const User, Password: String;Var ErrCode:Integer):Boolean;
    var
      hToken: Cardinal;
    begin
        if not AdjustToken then Exit;
        hToken := PerformLogon(User,'.',PassWord,ErrCode);
        try
            ImpersonateLoggedOnUser(hToken);
            try        finally
                RevertToSelf;
            end;
            Result:=(ErrCode=0);
        finally
            CloseHandle(hToken);//出现这个错误“External exception C0000008”
        end;
    end;
      

  5.   

    function PerformLogon(const User,Domain, Password: String;var ErrorCode:integer): Cardinal;
    begin
      if NOT LogonUser(pChar(User), pChar(Domain), pChar(Password),
                   LOGON32_LOGON_INTERACTIVE,//LOGON32_LOGON_NETWORK,
                   LOGON32_PROVIDER_DEFAULT,
                   Result) then
      ErrorCode:=getLastError//不管用户名,密码是否正确,都返回1314?
      else
      ErrorCode:=0;
    end;
      

  6.   

    问题找到了
    如果我用域用户名登录进去,运行
    AdjustTokenPrivileges(hdlTokenHandle,
                            False,
                            tkp,
                            Sizeof(tkpNewButIgnored),
                            tkpNewButIgnored,
                            lBufferNeeded) 
    时候会返回1300(getlasterror)错误,意思是权限没有设置成功,也就是SeTcbPrivilege没有设置成功,那么logonuser就不能用。
    如果用本机的administrator登录进去后就没有这些问题了。那位大侠能帮忙解决一下
      

  7.   

    补充一下,我的域用户已经设置成管理员了,为什么不能设置seTcbPrivilege权限呢?
      

  8.   

    参看http://www.comxc.com/article.php/2065
    http://www.swissdelphicenter.ch/torry/showcode.php?id=1177注意LogonUser只在本机有效的
      

  9.   

    不会吧,我在本机的administrator用户下
    可以使用logonuser来验证域用户名密码是可以的。
    如果不能用logonuser,那该用什么呢?