?
Solved

Programmatically find the computer SID with C# and CPP

Posted on 2009-04-01
2
Medium Priority
?
2,957 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
 

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

What does it mean to be "Always On"?

Is your cloud always on? With an Always On cloud you won't have to worry about downtime for maintenance or software application code updates, ensuring that your bottom line isn't affected.

Question has a verified solution.

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

Article by: Najam
Having new technologies does not mean they will completely replace old components.  Recently I had to create WCF that will be called by VB6 component.  Here I will describe what steps one should follow while doing so, please feel free to post any qu…
It was really hard time for me to get the understanding of Delegates in C#. I went through many websites and articles but I found them very clumsy. After going through those sites, I noted down the points in a easy way so here I am sharing that unde…
This video shows how to quickly and easily deploy an email signature for all users in Office 365 and prevent it from being added to replies and forwards. (the resulting signature is applied on the server level in Exchange Online) The email signat…
As many of you are aware about Scanpst.exe utility which is owned by Microsoft itself to repair inaccessible or damaged PST files, but the question is do you really think Scanpst.exe is capable to repair all sorts of PST related corruption issues?
Suggested Courses

609 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