?
Solved

Programmatically find the computer SID with C# and CPP

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

Free Tool: Port Scanner

Check which ports are open to the outside world. Helps make sure that your firewall rules are working as intended.

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.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Introduction This article series is supposed to shed some light on the use of IDisposable and objects that inherit from it. In essence, a more apt title for this article would be: using (IDisposable) {}. I’m just not sure how many people would ge…
The article shows the basic steps of integrating an HTML theme template into an ASP.NET MVC project
Did you know PowerShell can save you time with SaaS platforms? Simply leverage RESTfulAPIs to build your own PowerShell modules. These will kill repetitive tickets and tabs, using the command Invoke-RestMethod. Tune into this webinar to learn how…
Watch the software video of Kernel Import PST to Office 365 tools which can easily import PST and OST files to Office 365 for bulk mailboxes. The process of migration is simple and user can map source and destination mailboxes and easily import data…

569 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