में लॉगऑन एसआईडी कैसे प्राप्त करें C# .NET में Windows लॉगऑन एसआईडी कैसे पुनर्प्राप्त करता है? (उपयोगकर्ता एसआईडी नहीं, लेकिन प्रत्येक सत्र के लिए अद्वितीय नया)सी #
सी #
उत्तर
मुझे डर है कि आपको पी/Invoke का उपयोग करने का सहारा लेना है। (कृपया पृष्ठ के नीचे देखें) एक उदाहरण कैसे pinvoke.net पर यह करने के लिए नहीं है:
Result = GetTokenInformation(WindowsIdentity.GetCurrent().Token, TOKEN_INFORMATION_CLASS.TokenSessionId , TokenInformation , TokenInfLength , out TokenInfLength);
कृपया ध्यान दें कि मैं सिर्फ एक लाइन बदलकर उदाहरण बदल गया है, मैं TOKEN_INFORMATION_CLASS.TokenSessionId
साथ TOKEN_INFORMATION_CLASS.TokenUser
जगह ले ली है कि वास्तव में आप क्या जरूरत है ।
उम्मीद है कि इससे मदद मिलती है।
अद्यतन:
using System;
using System.Runtime.InteropServices;
using System.Security.Principal;
namespace LinqTest
{
public class ClsLookupAccountName
{
public const uint SE_GROUP_LOGON_ID = 0xC0000000; // from winnt.h
public const int TokenGroups = 2; // from TOKEN_INFORMATION_CLASS
enum TOKEN_INFORMATION_CLASS
{
TokenUser = 1,
TokenGroups,
TokenPrivileges,
TokenOwner,
TokenPrimaryGroup,
TokenDefaultDacl,
TokenSource,
TokenType,
TokenImpersonationLevel,
TokenStatistics,
TokenRestrictedSids,
TokenSessionId,
TokenGroupsAndPrivileges,
TokenSessionReference,
TokenSandBoxInert,
TokenAuditPolicy,
TokenOrigin
}
[StructLayout(LayoutKind.Sequential)]
public struct SID_AND_ATTRIBUTES
{
public IntPtr Sid;
public uint Attributes;
}
[StructLayout(LayoutKind.Sequential)]
public struct TOKEN_GROUPS
{
public int GroupCount;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 1)]
public SID_AND_ATTRIBUTES[] Groups;
};
// Using IntPtr for pSID instead of Byte[]
[DllImport("advapi32", CharSet = CharSet.Auto, SetLastError = true)]
static extern bool ConvertSidToStringSid(IntPtr pSID, out IntPtr ptrSid);
[DllImport("kernel32.dll")]
static extern IntPtr LocalFree(IntPtr hMem);
[DllImport("advapi32.dll", SetLastError = true)]
static extern bool GetTokenInformation(
IntPtr TokenHandle,
TOKEN_INFORMATION_CLASS TokenInformationClass,
IntPtr TokenInformation,
int TokenInformationLength,
out int ReturnLength);
public static string GetLogonId()
{
int TokenInfLength = 0;
// first call gets lenght of TokenInformation
bool Result = GetTokenInformation(WindowsIdentity.GetCurrent().Token, TOKEN_INFORMATION_CLASS.TokenGroups, IntPtr.Zero, TokenInfLength, out TokenInfLength);
IntPtr TokenInformation = Marshal.AllocHGlobal(TokenInfLength);
Result = GetTokenInformation(WindowsIdentity.GetCurrent().Token, TOKEN_INFORMATION_CLASS.TokenGroups, TokenInformation, TokenInfLength, out TokenInfLength);
if (!Result)
{
Marshal.FreeHGlobal(TokenInformation);
return string.Empty;
}
string retVal = string.Empty;
TOKEN_GROUPS groups = (TOKEN_GROUPS)Marshal.PtrToStructure(TokenInformation, typeof(TOKEN_GROUPS));
int sidAndAttrSize = Marshal.SizeOf(new SID_AND_ATTRIBUTES());
for (int i = 0; i < groups.GroupCount; i++)
{
SID_AND_ATTRIBUTES sidAndAttributes = (SID_AND_ATTRIBUTES)Marshal.PtrToStructure(
new IntPtr(TokenInformation.ToInt64() + i * sidAndAttrSize + IntPtr.Size), typeof(SID_AND_ATTRIBUTES));
if ((sidAndAttributes.Attributes & SE_GROUP_LOGON_ID) == SE_GROUP_LOGON_ID)
{
IntPtr pstr = IntPtr.Zero;
ConvertSidToStringSid(sidAndAttributes.Sid, out pstr);
retVal = Marshal.PtrToStringAuto(pstr);
LocalFree(pstr);
break;
}
}
Marshal.FreeHGlobal(TokenInformation);
return retVal;
}
}
}
N.B.: यहाँ काम कर रहे (कम से कम मेरी मशीन पर) कोड है मैंने इसे अपने x64 मशीन पर परीक्षण किया है, इसलिए कृपया TokenInformation.ToInt64()
कोड के टुकड़े पर ध्यान दें, शायद आपको इसे TokenInformation.ToInt32()
दुर्भाग्य से काम नहीं करता है। यह कुछ भी नहीं देता है। इसके अनुसार (http://msdn.microsoft.com/en-us/library/aa379626%28VS.85%29.aspx), यह केवल टर्मिनल सर्वर पर काम करता है, इसलिए हो सकता है कि यह सत्र आईडी मुझे न हो। – Jos
मैंने कोड का एक और संस्करण जोड़ा, यह मेरी मशीन पर काम करता है। कृपया मुझसे पूछने में संकोच न करें कि कुछ स्पष्ट नहीं है। –
धन्यवाद! यह पूरी तरह से काम करता है। मैंने टोकन समूह के बजाय टोकनलोगोनसिड का उपयोग किया, लेकिन यह केवल विंडोज विस्टा के लिए काम करता है और 7. – Jos
सिस्टम.Security.Principal.WindowsIdentity.GetCurrent()। User.AccountDomainSid - चाल चल सकता है?
यह * नहीं * लॉगऑन सत्र आईडी सिल्वरस्किन ने –
से पूछा कि मुझे लगता है कि उपयोगकर्ता एसआईडी सत्रों के बीच अपरिवर्तित बनी हुई है, लेकिन प्रत्येक लॉगिन के लिए टोकन बनाया गया है, इसे एक्सेस करना संभव है ... GetCurrent()। User.Token? – SilverSkin
टोकन वास्तव में मुझे चाहिए जो मुझे चाहिए, लेकिन मुझे एक प्रयोग योग्य एसआईडी में परिवर्तित करना होगा। – Jos
पता है कि यह एक पुरानी पोस्ट है। बस इस समस्या में भाग गया क्योंकि मुझे आईसीए सत्र आईडी और आरडीपी सत्र आईडी प्राप्त करना था ताकि एक प्रोग्राम प्रत्येक प्रकार के रिमोट कनेक्शन के लिए सही चर एकत्र कर सके। वर्तमान सत्र आईडी Regedit HKEY_CURRENT_USER \ Remote * में स्थित है। चूंकि मुझे डब्ल्यूटीएस के लिए कोई विकल्प नहीं मिला, मैं यहां अपना समाधान पोस्ट कर रहा हूं।
// Prints out ICA or RDP session ID of current user
using System;
using Microsoft.Win32;
namespace ViaRegedit
{
class Program03
{
static void Main(string[] args)
{
// Obtain an instance of RegistryKey for the CurrentUser registry
RegistryKey rkCurrentUser = Registry.CurrentUser;
// Obtain the test key (read-only) and display it.
RegistryKey rkTest = rkCurrentUser.OpenSubKey("Remote");
foreach (string valueName in rkTest.GetSubKeyNames())
{
//Getting path to RDP/Citrix session ID
string RDPICApath = "";
if (rkTest.OpenSubKey(valueName) != null && rkTest.OpenSubKey(valueName) != null) { RDPICApath = rkTest.OpenSubKey(valueName).ToString(); }
Console.WriteLine("Getting CurrentUser ICA-RDP path from string = " + RDPICApath);
//Seperating RDPICApath to get session number
string RDPICAnumber = RDPICApath.Substring(RDPICApath.LastIndexOf('\\') + 1);
Console.WriteLine("Current User RDPICAnumber = " + RDPICAnumber);
}
rkTest.Close();
rkCurrentUser.Close();
Console.ReadLine();
}
}
}
विंडवोस पर्यावरण में एसआईडी सुरक्षा पहचानकर्ता है, सत्र आईडी नहीं। सत्र आईडी प्राप्त करने के लिए 'System.Diagnostics.Process.GetCurrentProcess()। सत्र आईडी अधिक जानकारी के लिए [मेरा जवाब यहां] देखें (http://stackoverflow.com/a/16942663/725903) – mistika