有什么方法可以获得所有windows用户的SID

解决方案 »

  1.   

    {$EXTERNALSYM ConvertSidToStringSid}
    function ConvertSidToStringSid(Sid: PSID; StringSid: LPTSTR): BOOL; stdcall;
    {$EXTERNALSYM ConvertSidToStringSidA}
    function ConvertSidToStringSidA(Sid: PSID; StringSid: LPTSTR): BOOL; stdcall;
    {$EXTERNALSYM ConvertSidToStringSidW}
    function ConvertSidToStringSidW(Sid: PSID; StringSid: LPTSTR): BOOL; stdcall;function ConvertSidToStringSid; external advapi32 name 'ConvertSidToStringSidA';
    function ConvertSidToStringSidA; external advapi32 name 'ConvertSidToStringSidA';
    function ConvertSidToStringSidW; external advapi32 name 'ConvertSidToStringSidW';procedure TForm1.Button3Click(Sender: TObject);
    var
      cbSid: DWORD;
      Sid: PSID;
      peUse: SID_NAME_USE;
      cbReferencedDomainName: DWORD;
      ReferencedDomainName: PChar;
      SidStr: PChar;
    begin
      cbSid:=0;
      cbReferencedDomainName:=0;
      Sid:=nil; ReferencedDomainName:=nil;
      //首次调用取得Size
      LookupAccountName(nil, nil, Sid, cbSid, ReferencedDomainName, cbReferencedDomainName, peUse);  if (cbSid = 0) or (cbReferencedDomainName = 0) then
        Exit;//无效的用户名  GetMem(Sid, cbSid);
      GetMem(ReferencedDomainName, cbReferencedDomainName);
      try
        LookupAccountName(nil, nil, Sid, cbSid, ReferencedDomainName, cbReferencedDomainName, peUse);
        
        if ConvertSidToStringSid(Sid, @SidStr) then
          Self.Caption:=ReferencedDomainName + '\' + SidStr;
      finally
        FreeMemory(Sid);
        FreeMemory(ReferencedDomainName);
      end;
    end;
      

  2.   

    用WMI啊!!想要什么就有什么,从软的到硬的。
      

  3.   

    获取系统用户SID
    Select Name, SID From Win32_SystemAccount获取自定义用户SID
    Select Name, SID From Win32_UserAccount
      

  4.   

    或者
    Select * From Win32_AccountSID
      

  5.   

    当然是API最好的
    WMI是简单,但是服务停了就不好用了~另外注册表的HKEY_USERS下面就有的