起步软件技术论坛-X3

 找回密码
 立即注册
搜索
12
返回列表 发新帖
楼主: linjiawei

域用户登录问题,现场有人等着调试,急!麻烦优先处理一下**

[复制链接]
发表于 2007-7-18 16:01:49 | 显示全部楼层
如果没有登陆域,执行下面这段Delphi代码也会出错的
错误跟1楼一样
procedure TForm1.Button1Click(Sender: TObject);
var
  ntsys: OleVariant;
  procedure TryAdd(s: String);
  begin
    try
      Memo1.Lines.Add(s);
    except
    end;
  end;
begin
  Memo1.Clear;
  ntsys := CreateOleObject('WinNTSystemInfo');

  TryAdd('User    :'+ntsys.UserName);
  TryAdd('Computer:'+ ntsys.ComputerName);
  TryAdd('Domain  :'+ ntsys.DomainName);
  TryAdd('PDC     :'+ ntsys.PDC);
end;
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-7-18 16:08:00 | 显示全部楼层
好的,谢谢,我编译一个发到现场测试一下。
回复 支持 反对

使用道具 举报

发表于 2007-7-18 16:31:05 | 显示全部楼层
11楼的程序,运行起来如果有
PDC: xxx.xxx.xxx.xxx
就说明已经登陆域了
如果没有就说明没有登陆域
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-7-20 17:29:29 | 显示全部楼层
上面的程序在新区中运行有时报错有时又不报,很奇怪。
看平台的域用户验证过程,其实实质只要获取登录机器的帐号就行了,其他的好像都没有用。如果这样可能会带来一点安全隐患。
static function TINIT.LoginUseAD: Boolean;
var
  I: Integer;
  o: object;
  disp: System.dispatchhelper;
  s, domain, pdc, username: string;
  person: Org.TPerson;
  domains: IXMLDOMNodeList;
  domainNode: IXMLDOMElement;
  pdcip: array of string;
begin
  Result := False;
  try
    o := ComObj.CreateOleObject('WinNTSystemInfo');
    try
      disp := TDispatchHelper.Create(o);
      domain := disp.PropertyGet('DomainName', []) as System.String;
      if domain = '' then
        Exit;

[B]     // pdc := disp.PropertyGet('PDC', []) as System.String;[/B]

      username := disp.PropertyGet('UserName', []) as System.String;
      if username = '' then
        Exit;
    finally
      (o as System.IDisposable).Dispose;
    end;

[B]  {  domains := SysSrv.SysService.Config.Element.getElementsByTagName('domain');
    for I := 0 to domains.length - 1 do
    begin
      domainNode := domains.item[I] as IXMLDOMElement;
      s := ObjectHelper.ToString(domainNode.getAttribute('name'), '');
      if SysUtils.SameText(s, domain) then
      begin
        s := ObjectHelper.ToString(domainNode.getAttribute('pdcip'), '');
        if s <> '' then
        begin
          pdcip := s.Split([';', ',', ' ']);
          if not (pdcip as IList).Contains(jsSysUtils.GetComputerIPStr(pdc)) then
            Exit;
        end;  
       s := ObjectHelper.ToString(domainNode.getAttribute('account'), domain);
        BizSys.BizSystem.ClientAccount := s;   }[/B]
        s := Opr.OperatorLoader.FindPersonID(username, '', False);
        if s = '' then
          Exit;

        person := Org.OrgSys.OrgSystem.FindPerson(s);

        if person = nil then
          Exit;

        Result := TSystemCore.Logon(person.ID, person.Password);

        Exit;
[B]    //  end;
   // end;[/B]
  except
  end;
end;
回复 支持 反对

使用道具 举报

发表于 2007-7-20 18:11:06 | 显示全部楼层
楼上的说的不完全正确,正是因为有安全隐患,所以加上验证主域控制器的ip是否与服务器上指定的ip一致的代码。取消验证后,虽然可用,但确实存在安全隐患。
回复 支持 反对

使用道具 举报

发表于 2007-7-25 10:14:29 | 显示全部楼层
??
回复 支持 反对

使用道具 举报

发表于 2007-7-26 10:16:33 | 显示全部楼层
这个帖子我结贴了,有问题请重新开帖
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2025-1-13 06:27 , Processed in 0.036321 second(s), 13 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表