Visual C++ 7.1Visual C++ 7.0Visual Studio .NET 2003Windows 2003Windows 2000Visual C++ 6.0Windows XPMFC中间开发Visual StudioWindowsC++
转换对象名称到 SID 和反之






3.38/5 (13投票s)
2004 年 5 月 8 日
2分钟阅读

68245

2147
用于将 SID 转换为对象名称,反之亦然的工具。
引言
目的是创建一个应用程序,帮助我们检索对象的名称(例如,用户名)及其域名,前提是该对象的 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) }
整个代码的核心是这两个函数
GetTextualSid
和 GetBinarySid
用于将 SID 结构转换为文本 SID,反之亦然。 我们也可以使用 MS 提供的其他函数来实现同样的目的,例如 ConvertStringSidToSid
和 ConvertSidToStringSid
。 请参阅来自 Code Project 的 Brian Friesen 的“在字符串和二进制之间转换 SID”,或者也可以从 Microsoft 网站 获取。