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);
|
|||
|
}
|