65.9K
CodeProject 正在变化。 阅读更多。
Home

转换对象名称到 SID 和反之

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.38/5 (13投票s)

2004 年 5 月 8 日

2分钟阅读

viewsIcon

68245

downloadIcon

2147

用于将 SID 转换为对象名称,反之亦然的工具。

Sample Image - lkupuserinfo_jpg.jpg

引言

目的是创建一个应用程序,帮助我们检索对象的名称(例如,用户名)及其域名,前提是该对象的 SID 可用。SID 必须采用“S-1-5-21-39….”格式。

如果对象的名称(例如用户名)和系统名称可用,该应用程序也对获取对象的 SID 很有用。

此应用程序也将在域环境中工作,其中对象名称应为“Domainname\objectname”。如果系统名称不可用,则使用本地系统来获取信息。

当我想了解 ethereal 数据包时,以及想知道 CIFS 客户端的请求来自哪个用户上下文时,此应用程序特别有用。

这是一个简单的基于 MFC 的 .NET 应用程序。 该应用程序基于 2 个简单的函数

  • FetchUserName:如果 SID 和系统名称可用,则使用此函数获取对象名称和域名。如果系统名称不可用,则假定要获取本地计算机上的 SID。系统名称可以是域范围内的名称,并且可以采用 Domainname\SystemName 格式。

    代码片段

    FetchUserName(LPTSTR strtext,LPTSTR lpSystemName,
                  LPTSTR *lpUserName, LPTSTR *lpDomainName){
     
     Sid = GetBinarySid(strtext); //convert stringSID to SID structure
     RetBln = LookupAccountSid(lpSystemName,
                                Sid,
                                *lpUserName,
                                &usernameLength,
                                *lpDomainName,
                                &domainnameLength,
            &snu); 
            //function used to get the name 
            //of the object given the SID structure is given
     
    }
  • FetchSID:如果对象名称和系统名称可用,则使用此函数以文本格式获取对象 SID 和域名。如果系统名称不可用,则假定要获取本地计算机上的 SID。系统名称可以是域范围内的名称,并且可以采用 Domainname\SystemName 格式。

    代码片段

    FetchSID(LPTSTR strText,LPTSTR systemName,LPTSTR *SID,LPTSTR *domainName){
     
    //This is done just to know the buffer size for SID as well as Domain name 
    returnValue = LookupAccountName (systemName,
                           strText,
                           mySid,
                           &sidSize,
                           tempdomainName,
                           &refDomainSize,
                           &snu); 
    if(sidSize){
            mySid = (PSID) malloc (sidSize);
            memset(mySid,0,sidSize);
    }else{
    returnValue = ERROR_INVALID_PARAMETER;
            goto exitfunc;
    }
        
    if(refDomainSize){
            tempdomainName = (LPTSTR) malloc (refDomainSize * sizeof(TCHAR));
            memset(tempdomainName,0,refDomainSize * sizeof(TCHAR));
    }
        //Now get the SID and the domain name
    if (!LookupAccountName (systemName,
                            strText,
                            mySid,
                            &sidSize,
                            tempdomainName,
                            &refDomainSize,
                            &snu)
           
    }

整个代码的核心是这两个函数

GetTextualSidGetBinarySid 用于将 SID 结构转换为文本 SID,反之亦然。 我们也可以使用 MS 提供的其他函数来实现同样的目的,例如 ConvertStringSidToSidConvertSidToStringSid。 请参阅来自 Code Project 的 Brian Friesen 的“在字符串和二进制之间转换 SID”,或者也可以从 Microsoft 网站 获取。

© . All rights reserved.