212 lines
4.7 KiB
C
212 lines
4.7 KiB
C
/*++
|
||
|
||
Copyright (c) 1991 Microsoft Corporation
|
||
|
||
Module Name:
|
||
|
||
tgetsid.c
|
||
|
||
Abstract:
|
||
|
||
This file is a temporary test for querying the machine's SID.
|
||
|
||
Author:
|
||
|
||
Jim Kelly (JimK) 8-10-1994
|
||
|
||
Environment:
|
||
|
||
User Mode - Win32
|
||
|
||
to build: nmake UMTYPE=console UMTEST=tgetsid
|
||
|
||
Revision History:
|
||
|
||
|
||
--*/
|
||
|
||
///////////////////////////////////////////////////////////////////////////////
|
||
// //
|
||
// Includes //
|
||
// //
|
||
///////////////////////////////////////////////////////////////////////////////
|
||
|
||
|
||
#include <nt.h>
|
||
#include <ntrtl.h>
|
||
#include <ntlsa.h>
|
||
#include <stdio.h>
|
||
#include <string.h>
|
||
|
||
BOOLEAN
|
||
GetMachineSid(
|
||
OUT PSID *Sid,
|
||
OUT PULONG SidLength
|
||
);
|
||
|
||
VOID __cdecl
|
||
main( VOID )
|
||
|
||
{
|
||
|
||
BOOLEAN
|
||
Result;
|
||
|
||
PSID
|
||
Sid;
|
||
|
||
PISID
|
||
ISid;
|
||
|
||
ULONG
|
||
i,
|
||
SubCount,
|
||
Tmp,
|
||
SidLength;
|
||
|
||
|
||
Result = GetMachineSid( &Sid, &SidLength );
|
||
|
||
if (Result) {
|
||
|
||
ISid = (PISID)Sid; // pointer to opaque structure
|
||
|
||
printf("S-%u-", (USHORT)ISid->Revision );
|
||
|
||
if ( (ISid->IdentifierAuthority.Value[0] != 0) ||
|
||
(ISid->IdentifierAuthority.Value[1] != 0) ){
|
||
printf("0x%02hx%02hx%02hx%02hx%02hx%02hx",
|
||
(USHORT)ISid->IdentifierAuthority.Value[0],
|
||
(USHORT)ISid->IdentifierAuthority.Value[1],
|
||
(USHORT)ISid->IdentifierAuthority.Value[2],
|
||
(USHORT)ISid->IdentifierAuthority.Value[3],
|
||
(USHORT)ISid->IdentifierAuthority.Value[4],
|
||
(USHORT)ISid->IdentifierAuthority.Value[5] );
|
||
} else {
|
||
Tmp = (ULONG)ISid->IdentifierAuthority.Value[5] +
|
||
(ULONG)(ISid->IdentifierAuthority.Value[4] << 8) +
|
||
(ULONG)(ISid->IdentifierAuthority.Value[3] << 16) +
|
||
(ULONG)(ISid->IdentifierAuthority.Value[2] << 24);
|
||
printf("%lu", Tmp);
|
||
}
|
||
|
||
SubCount = (ULONG)(*RtlSubAuthorityCountSid( Sid ));
|
||
for (i = 0; i<SubCount; i++) {
|
||
printf("-0x%lx", (*RtlSubAuthoritySid( Sid, i)));
|
||
}
|
||
|
||
}
|
||
|
||
printf("\n\n Th Tha That's all folks\n");
|
||
|
||
|
||
|
||
}
|
||
|
||
|
||
BOOLEAN
|
||
GetMachineSid(
|
||
OUT PSID *Sid,
|
||
OUT PULONG SidLength
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
This routine retrieves the sid of this machine's account
|
||
domain and returns it in memory allocated with RtlAllocateHeap().
|
||
If this machine is a server in a domain, then this SID will
|
||
be domain's SID.
|
||
|
||
|
||
Arguments:
|
||
|
||
Sid - receives a pointer to the returned SID.
|
||
|
||
SidLength - Receives the length (in bytes) of the returned SID.
|
||
|
||
|
||
Return Value:
|
||
|
||
TRUE - The SID was allocated and returned.
|
||
|
||
FALSE - Some error prevented the SID from being returned.
|
||
|
||
--*/
|
||
|
||
{
|
||
NTSTATUS
|
||
Status;
|
||
|
||
OBJECT_ATTRIBUTES
|
||
ObjectAttributes;
|
||
|
||
LSA_HANDLE
|
||
PolicyHandle;
|
||
|
||
POLICY_ACCOUNT_DOMAIN_INFO
|
||
*DomainInfo = NULL;
|
||
|
||
PSID
|
||
ReturnSid;
|
||
|
||
BOOLEAN
|
||
ReturnStatus = FALSE;
|
||
|
||
|
||
|
||
InitializeObjectAttributes( &ObjectAttributes,
|
||
NULL, // No name
|
||
0, // No attributes
|
||
0, // No root handle
|
||
NULL // No SecurityDescriptor
|
||
);
|
||
|
||
Status = LsaOpenPolicy( NULL, // Local System
|
||
&ObjectAttributes,
|
||
POLICY_VIEW_LOCAL_INFORMATION,
|
||
&PolicyHandle
|
||
);
|
||
|
||
if (NT_SUCCESS(Status)) {
|
||
|
||
Status = LsaQueryInformationPolicy(
|
||
PolicyHandle,
|
||
PolicyAccountDomainInformation,
|
||
&DomainInfo
|
||
);
|
||
|
||
if (NT_SUCCESS(Status)) {
|
||
|
||
ASSERT(DomainInfo != NULL);
|
||
|
||
//
|
||
// Allocate the return buffer
|
||
//
|
||
|
||
(*SidLength) = RtlLengthSid( DomainInfo->DomainSid );
|
||
ReturnSid = RtlAllocateHeap( RtlProcessHeap(), 0, (*SidLength) );
|
||
|
||
if (ReturnSid != NULL) {
|
||
|
||
//
|
||
// Copy the sid
|
||
//
|
||
|
||
RtlMoveMemory( ReturnSid, DomainInfo->DomainSid, (*SidLength) );
|
||
(*Sid) = ReturnSid;
|
||
ReturnStatus = TRUE;
|
||
}
|
||
|
||
|
||
LsaFreeMemory( DomainInfo );
|
||
}
|
||
|
||
Status = LsaClose( PolicyHandle );
|
||
ASSERT(NT_SUCCESS(Status));
|
||
}
|
||
|
||
return(ReturnStatus);
|
||
}
|