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

如何在C#中获取登录SID分享

时间:2023-04-11 11:27:45 C#

C#学习教程:如何在C#中获取登录SID(不是用户SID,而是每个会话一个唯一的新SID)恐怕您将不得不诉诸于使用P/Invoke。在pinvoke.net上有一个如何执行此操作的示例(请参阅页面底部):请注意,我通过更改一行示例进行了更改,我将TOKEN_INFORMATION_CLASS.TokenUser替换为TOKEN_INFORMATION_CLASS.TokenUser,这正是您所需要的。希望这可以帮助。更新:这是工作(至少在我的机器上)代码:usingSystem;使用System.Runtime.InteropServices;使用System.Security.Principal;namespaceLinqTest{publicclassClsLookupAccountName{publicconstuintSE_GROUP_LOGON_ID=0xC0000000;//来自winnt.hpublicconstintTokenGroups=2;//fromTOKEN_INFORMATION_CLASSenumTOKEN_INFORMATION_CLASS{TokenUser=1,TokenGroups,TokenPrivileges,TokenOwner,TokenPrimaryGroup,TokenDefaultDacl,TokenSource,TokenType,TokenImpersonationLevel,TokenStatistics,TokenRestrictedSids,TokenSessionId,TokenGroupsAndPrivileges,TokenSessionReference,TokenSandBoxInert,TokenAuditPolicy,TokenOrigin}[StructLayout(LayoutKind.Sequential)]publicstructSID_AND_ATTRIBUTES{publicIntPtrSid;公共uint属性;}[StructLayout(LayoutKind.Sequential)]publicstructTOKEN_GROUPS{publicintGroupCount;[MarshalAs(UnmanagedType.ByValArray,SizeConst=1)]publicSID_AND_ATTRIBUTES[]组;};//将IntPtr用于pSID字节[][DllImport("advapi32",CharSet=CharSet.Auto,SetLastError=true)]staticexternboolConvertSidToStringSid(IntPtrpSID,outIntPtrptrSid);[DllImport("kernel32.dll")]staticexternIntPtrLocalFree(IntPtrhMem);[DllImport("advapi32.dll",SetLastError=true)]staticexternboolGetTokenInformation(IntPtrTokenHandle,TOKEN_INFORMATION_CLASSTokenInformationClass,IntPtrTokenInformation,intTokenInformationLength,outintReturnLength);公共静态字符串GetLogonId(){intTokenInfLength=0;//第一次调用获取TokenInformationboolResult=GetTokenInformation(WindowsIdentity.GetCurrent().Token,TOKEN_INFORMATION_CLASS.TokenGroups,IntPtr.Zero,TokenInfLength,outTokenInfLength);IntPtrTokenInformation=Marshal.AllocHGlobal(TokenInfLength);结果=GetTokenInformation(WindowsIdentity.GetCurrent().Token,TOKEN_INFORMATION_CLASS.TokenGroups,TokenInformation,TokenInfLength,outTokenInfLength);如果(!结果){三月shal.FreeHGlobal(TokenInformation);返回字符串。空;}stringretVal=string.Empty;TOKEN_GROUPS组=(TOKEN_GROUPS)Marshal.PtrToStructure(TokenInformation,typeof(TOKEN_GROUPS));intsidAndAttrSize=Marshal.Size_Of_ATTRID;for(inti=0;iNB我在我的x64机器上测试过它,所以请密切注意TokenInformation.ToInt64()片段,也许你应该用TokenInformation.ToInt32()System.Security.Principal.WindowsIdentity.GetCurrent替换它()User.AccountDomainSid-可能会这样做?我知道这是一篇旧文章。刚遇到这个问题是因为我必须获取ICA会话ID和RDP会话ID才能为每种类型的远程连接获取程序正确的变量已收集。当前会话ID在RegeditHKEY_CURRENT_USERRemote*中。由于我找不到WTS的任何替代品,我在这里发布我的解决方案。以上就是C#学习教程:如何在C#中登录SID获取所有分享的内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注---//打印出当前用户使用System的ICA或RDP会话ID;使用Microsoft.Win32;namespaceViaRegedit{classProgram03{staticvoidMain(string[]args){//为CurrentUserregistryKey获取RegistryKey的实例rkCurrentUser=Registry.CurrentUser;//获取测试密钥(只读)并显示。RegistryKeyrkTest=rkCurrentUser.OpenSubKey("Remote");foreach(stringvalueNameinrkTest.GetSubKeyNames()){//获取RDP/Citrix会话ID的路径stringRDPICApath="";if(rkTest.OpenSubKey(valueName)!=null&&rkTest.OpenSubKey(valueName)!=null){RDPICApath=rkTest.OpenSubKey(valueName).ToString();}Console.WriteLine("从字符串中获取当前用户ICA-RDP路径="+RDPICApath);//分离RDPICApath得到会话号stringRDPICAnumber=RDPICApath.Substring(RDPICApath.LastIndexOf('\')+1);Console.WriteLine("当前我们erRDPICAnumber="+RDPICAnumber);}rkTest.Close();rkCurrentUser.Close();Console.ReadLine();}}}本文整理自网络,不代表立场,如涉及侵权,敬请谅解点击右侧联系管理员删除,转载请注明出处: