2008-10-30 5 views
26

मैं वर्तमान विंडोज उपयोगकर्ता खाते के लिए एसआईडी प्राप्त करने का एक आसान तरीका ढूंढ रहा हूं। मुझे पता है कि मैं इसे डब्लूएमआई के माध्यम से कर सकता हूं, लेकिन मैं उस मार्ग पर जाना नहीं चाहता हूं।मैं वर्तमान विंडोज खाते का एसआईडी कैसे प्राप्त कर सकता हूं?

सी # में निर्दिष्ट करने वाले सभी लोगों के लिए क्षमा करें जो इसे सी ++ निर्दिष्ट नहीं करते हैं। :-)

+0

प्रोग्रामिंग भाषा/पर्यावरण? –

उत्तर

43

Win32 में, GetTokenInformation फोन, एक टोकन हैंडल और TokenUser लगातार गुजर। यह आपके लिए TOKEN_USER संरचना भर देगा। वहां के तत्वों में से एक उपयोगकर्ता का एसआईडी है। यह एक बीएलओबी (बाइनरी) है, लेकिन आप इसे ConvertSidToStringSid का उपयोग कर स्ट्रिंग में बदल सकते हैं।

वर्तमान टोकन हैंडल को पकड़ने के लिए, OpenThreadToken या OpenProcessToken का उपयोग करें।

यदि आप एटीएल पसंद करते हैं, तो इसमें CAccessToken कक्षा है, जिसमें इसमें सभी प्रकार की दिलचस्प चीजें हैं।

.NET में Thread.CurrentPrinciple संपत्ति है, जो एक IPrincipal संदर्भ देता है।

IPrincipal principal = Thread.CurrentPrincipal; 
WindowsIdentity identity = principal.Identity as WindowsIdentity; 
if (identity != null) 
    Console.WriteLine(identity.User); 

इसके अलावा .NET में, आप WindowsIdentity.GetCurrent() है, जो वर्तमान उपयोगकर्ता आईडी रिटर्न का उपयोग कर सकते हैं:: आप सिड प्राप्त कर सकते हैं

WindowsIdentity identity = WindowsIdentity.GetCurrent(); 
if (identity != null) 
    Console.WriteLine(identity.User); 
2

CodeProject कुछ अलग तरीकों तुम कोशिश कर सकते हैं ... आप कौन-सी भाषाओं आप में एक समाधान चाहता था का उल्लेख नहीं था।

आप एक बैच फ़ाइल या कुछ और के माध्यम से इसे उपयोग करना चाहते हैं, तो आप है Sysinternals द्वारा PsGetSid के रूप में देख सकते हैं। यह एसआईडी को नामों और इसके विपरीत अनुवाद करता है।

0

आपने यह निर्दिष्ट नहीं किया कि आप कौन सी भाषा चाहते हैं। लेकिन अगर आप सी # के लिए तैयार हैं तो यह आलेख Win32 API का उपयोग करने वाली WMI विधि दोनों के साथ-साथ तेज़ (जबकि अधिक वर्बोज़) विधि प्रदान करता है।

http://www.codeproject.com/KB/cs/processownersid.aspx

मैं वर्तमान में WMI या Win32 एपीआई का उपयोग कर के बिना ऐसा करने का एक और तरीका है नहीं लगता।

6

यह आपको क्या चाहिए आपको देना चाहिए:

System.Security.Principal उपयोग करते हुए;

...

वर sid = WindowsIdentity.GetCurrent() उपयोगकर्ता।

WindowsIdentity के उपयोगकर्ता संपत्ति सिड देता है, प्रति MSDN Docs

2

सी # में आप उपयोग कर सकते हैं या तो

using Microsoft.Win32.Security;

...

string username = Environment.UserName + "@" + Environment.GetEnvironmentVariable("USERDNSDOMAIN");

Sid sidUser = new Sid (username);

या ...

using System.Security.AccessControl;

using System.Security.Principal;

...

WindowsIdentity m_Self = WindowsIdentity.GetCurrent();

SecurityIdentifier m_SID = m_Self.Owner;");

1

मैं एक और तरीका सिड पाने के लिए मिला:

System.Security.Principal.WindowsIdentity id = System.Security.Principal.WindowsIdentity.GetCurrent(); 
string sid = id.User.AccountDomainSid.ToString(); 
0

यह उन सभी में से सबसे छोटा है जो मुझे विश्वास है।

UserPrincipal.Current.Sid; 

.net के साथ उपलब्ध है> = 3,5

5
ATL::CAccessToken accessToken; 
ATL::CSid currentUserSid; 
if (accessToken.GetProcessToken(TOKEN_READ | TOKEN_QUERY) && 
    accessToken.GetUser(&currentUserSid)) 
    return currentUserSid.Sid(); 
+0

यह बहुत संक्षिप्त है। –

0

और मूल कोड में:

function GetCurrentUserSid: string; 

    hAccessToken: THandle; 
    userToken: PTokenUser; 
    dwInfoBufferSize: DWORD; 
    dw: DWORD; 

    if not OpenThreadToken(GetCurrentThread, TOKEN_QUERY, True, ref hAccessToken) then 
     dw <- GetLastError; 
     if dw <> ERROR_NO_TOKEN then 
      RaiseLastOSError(dw); 

     if not OpenProcessToken(GetCurrentProcess, TOKEN_QUERY, ref hAccessToken) then 
      RaiseLastOSError; 
    try 
     userToken <- GetMemory(1024); 
     try 
      if not GetTokenInformation(hAccessToken, TokenUser, userToken, 1024, ref dwInfoBufferSize) then 
       RaiseLastOSError; 
      Result <- SidToString(userToken.User.Sid); 
     finally 
      FreeMemory(userToken); 
    finally 
     CloseHandle(hAccessToken);