mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
211 lines
4.7 KiB
211 lines
4.7 KiB
/*++
|
|
|
|
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);
|
|
}
|