windows-nt/Source/XPSP1/NT/ds/security/base/lsa/uclient/tgetsid.c

212 lines
4.7 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
/*++
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);
}