当前位置: 首页 > 编程语言 > C#

我从C#成功调用了advapi32的LsaEnumerateAccountRights(),现在如何解组它返回的LSA_UNICODE_STRING数组?

时间:2023-04-11 00:19:28 C#

我从C#成功调用了advapi32的LsaEnumerateAccountRights()。现在如何解组它返回的LSA_UNICODE_STRING数组?它是指向LSA_UNICODE_STRING结构数组的指针。我找到了一些相反的代码,即从C#字符串创建LSA_UNICODE_STRING。您可以在下面的帮助程序代码部分看到它。我所做的包括调用LsaEnumerateAccountRights()似乎工作正常。为数组指针和计数返回合理的值。我不知道如何处理那些爆炸的琴弦。请帮忙?好的?更新:下面答案中nobugz的辅助函数几乎是正确的,你只需要UnicodeEncoding.CharSize来划分长度。多亏了他,我现在可以看到数组中的第一个字符串。请参阅下面两个代码部分末尾的更新。现在,我如何进行地狱世界指针运算?更新2.5:请参阅函数代码的答案。我丢失了旧的“错误”代码。找到了!在这篇博文中。修改后的代码现在完全有效。它甚至是64位安全的!主要代码:IntPtrsid=IntPtr.Zero;intsidSize=0;StringBuilder域名=newStringBuilder();int名称大小=0;int账户类型=0;LookupAccountName("\\"+tbHost.Text,tbUsername.Text,sid,refsidSize,domainName,refnameSize,refaccountType);domainName=newStringBuilder(nameSize);sid=Marshal.AllocHGlobal(sidSize);boolresult=LookupAccountName("\\"+tbHost.Text,tbUsername.Text,sid,refsidSize,domainName,refnameSize,refaccountType);myResults.Text+=String.Format("LookupAccountName():结果{0},SID{1}n",result,sid);LSA_UNICODE_STRINGsystemName=string2LSAUS("\\"+tbHost.Text);IntPtrpolicyHandle=IntPtr.Zero;LSA_OBJECT_ATTRIBUTESobjAttrs=newLSA_OBJECT_ATTRIBUTES();uintretVal=LsaOpenPolicy(refsystemName,refobjAttrs,POLICY_LOOKUP_NAMES|POLICY_VIEW_LOCAL_INFORMATION,outpolicyHandle);myResults.Text+=String.Format("LsaOpenPolicy():结果{0},策略句柄{1}n",retVal,policyH安德尔);IntPtrrightsArray=IntPtr.Zero;ulong权利计数=0;longlretVal=LsaEnumerateAccountRights(policyHandle,sid,outrightsArray,outrightsCount);retVal=LsaNtStatusToWinError(lretVal);如果(retVal!=0)抛出新的System.ComponentModel.Win32Exception((int)retVal);myResults.Text+=String.Format("LsaEnumerateAccountRights():结果{0},RightsArray{1},Count{2}n",retVal,rightsArray,rightsCount);LSA_UNICODE_STRINGmyLsaus=newLSA_UNICODE_STRING();for(ulongi=0;i辅助函数数,导入等:publicconstintPOLICY_VIEW_LOCAL_INFORMATION=0x1;publicconstintPOLICY_LOOKUP_NAMES=0x00000800;[DllImport("advapi32.dll",CharSet=CharSet.Unicode,PreserveSig=true)]publicstaticexternUInt32LsaNtStatusToWinError(longStatus);[DllImport("advapi32.dll",CharSet=CharSet.Unicode,SetLastError=true,PreserveSig=true)]publicstaticexternboolConvertStringSidToSid(stringStringSid,outIntPtrpSid);[DllImport("advapi32.dll",CharSet=CharSet.Unicode,SetLastError=true,PreserveSig=true)]publicstaticexternboolLookupAccountName(stringlpSystemName,stringlpAccountName,IntPtrpsid,refintcbsid,StringBuilderdomainName,refintcbdomainLength,refintuse);[DllImport("advapi32.dll",CharSet=CharSet.Unicode,PreserveSig=true)]publicstaticexternUInt32LsaOpenPolicy(refLSA_UNICODE_STRINGSystemName,refLSA_OBJECT_ATTRIBUTESObjectAttributes,Int32DesiredAccess,outIntPtrPolicyHandle);[DllImport("advapi32.dll",SetLastError=true,PreserveSig=true)]publicstaticexternlongLsaEnumerateAccountRights(IntPtrPolicyHandle,IntPtrAccountSid,out/*LSA_UNICODE_STRING[]*/IntPtrUserRights,outulongCountOfRights);[DllImport("advapi32.dll",SetLastError=true,PreserveSig=true)]publicstaticexternlongLsaClose(IntPtrPolicyHandle);[StructLayout(LayoutKind.Sequential,CharSet=CharSet.Unicode)]publicstructLSA_UNICODE_STRING{p公共UInt16长度;公共UInt16最大长度;公共IntPtr缓冲区;}[StructLayout(LayoutKind.Sequential,CharSet=CharSet.Unicode)]publicstructLSA_OBJECT_ATTRIBUTES{publicIntPtrRootDirectory;公共IntPtr安全描述符;公共IntPtr安全服务质量;公共LSA_UNICODE_STRING对象名;publicUInt32属性;公共UInt32长度;}publicstaticLSA_UNICODE_STRINGstring2LSAUS(stringmyString){LSA_UNICODE_STRINGretStr=newLSA_UNICODE_STRING();retStr.Buffer=Marshal.StringToHGlobalUni(myString);retStr.Length=(UInt16)(myString.Length*UnicodeEncoding.CharSize);retStr.MaximumLength=(UInt16)((myString.Length+1)*UnicodeEncoding.CharSize);返回返回值;}publicstaticstringLSAUS2string(LSA_UNICODE_STRINGlsaus){char[]cvt=newchar[lsaus.Length/UnicodeEncoding.CharSize];Marshal.Copy(lsaus.Buffer,cvt,0,lsaus.Length/UnicodeEncoding.CharSize);返回新字符串(cvt);}这应该对你有用:上面描述的就是C#学习教程:我从C#成功调用了advapi32的LsaEnumerateAccountRights()现在我该如何解组它返回的LSA_UNICODE_STRING数组?如果分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注---privatestaticstringLSAUS2String(LSA_UNICODE_STRINGlsa){char[]cvt=newchar[lsa.Length];Marshal.Copy(lsa.Buffer,cvt,0,lsa.Length);返回新字符串(cvt);}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:

最新推荐
猜你喜欢