Solved

Programmatically find the computer SID with C# and CPP

Posted on 2009-04-01
2
2,808 Views
Last Modified: 2012-05-06
In need 2 routines, one in cpp and the other in C#. The code shows the cpp code to get the SID for the computer. I think this is correct, I have been using it for awhile. Then I need to be able to do the same thing in C#. Neither program will have administrative rights.

When I run these 2 code snipits on a computer on a domain I get the domain SID for the computer. I can verify this with ADSIViewer. Same results for both! Good, half way there.

If I then move the code to a machine that is not on a domain the CPP code will return a SID. But the .net C# code always throws no matter what computer name I give it.

This can't be that hard. So if someone has some ideas....


Scott
//
//	Get the size of the buffers
//
  cbSid        = 0;
  cbDomainName = 0;
  Sid          = NULL;
  LookupAccountName( NULL, szAccount, Sid, &cbSid, pszDomainName, &cbDomainName,  &eUse );
//
//	Now get the actual SID
//	
  Sid           = (PSID)  malloc(cbSid);
   pszDomainName = (LPSTR) malloc(cbDomainName);
 
   bRC = LookupAccountName( NULL, szAccount, Sid, &cbSid, pszDomainName   , &cbDomainName, &eUse ); 
  if( bRC )
  {
    strcpy_s( m_szDomainName, sizeof(m_szDomainName), pszDomainName );   	
    bRC = ConvertSidToStringSid( Sid, &pszSid ); 
    if( bRC )
   {
     sprintf_s( szWork, sizeof(szWork), "       FQDN : %s\\%s   - SID_NAME_USE: %li",     m_szDomainName,  m_szComputerName, eUse);
  printf( "%s\r\n", szWork ); 			
  strcpy_s( m_szMachineSID, sizeof(m_szMachineSID), pszSid );
  printf( "  MachineSID: %s\r\n", m_szMachineSID );    			
  if (pszSid)	LocalFree( pszSid );
 }
 }
 
==================================  C#  ===============================
	String sSid;
	SecurityIdentifier sid, sid2;
	NTAccount nta, acct;
	try
	{
		nta = new NTAccount( "SNORBERG-T5400$" );	
	
		sid = (SecurityIdentifier) nta.Translate( typeof(SecurityIdentifier));
		sSid = m_Config.MachineSID;
		sid2 = new SecurityIdentifier( sSid + "-513");
	
		acct = (NTAccount)sid.Translate(typeof(NTAccount));	
		acct = (NTAccount)sid2.Translate(typeof(NTAccount));
	}
	catch( Exception ex )
	{
		MessageBox.Show( ex.Message );
	}

Open in new window

0
Comment
Question by:snorberg
2 Comments
 
LVL 21

Expert Comment

by:MogalManic
ID: 24048414
0
 

Accepted Solution

by:
snorberg earned 0 total points
ID: 24049461
It seems that the only way this can be done from .net code is by using the win32 api commands through the runtime.interopServices.
http://www.pinvoke.net/default.aspx/advapi32.LookupAccountName
The pinvoke site has a reasonable example.
 
0

Featured Post

Free Tool: Site Down Detector

Helpful to verify reports of your own downtime, or to double check a downed website you are trying to access.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Exception Handling is in the core of any application that is able to dignify its name. In this article, I'll guide you through the process of writing a DRY (Don't Repeat Yourself) Exception Handling mechanism, using Aspect Oriented Programming.
Real-time is more about the business, not the technology. In day-to-day life, to make real-time decisions like buying or investing, business needs the latest information(e.g. Gold Rate/Stock Rate). Unlike traditional days, you need not wait for a fe…
I've attached the XLSM Excel spreadsheet I used in the video and also text files containing the macros used below. https://filedb.experts-exchange.com/incoming/2017/03_w12/1151775/Permutations.txt https://filedb.experts-exchange.com/incoming/201…

756 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question