mirror of https://github.com/lianthony/NT4.0
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.
1446 lines
49 KiB
1446 lines
49 KiB
/*++
|
|
|
|
Copyright (c) 1991 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
samrpc.idl
|
|
|
|
Abstract:
|
|
|
|
Security Account Manager RPC Interface Definition File
|
|
|
|
This file contains the RPC Interface Definition Language file for
|
|
remotable SAM functions.
|
|
|
|
These functions are internal versions of API and are NOT visible to
|
|
SAM clients. SAM clients call the SAM API defined in file ntsam.h.
|
|
Those routines, in turn, call corresponding RPC routines defined by
|
|
this file.
|
|
|
|
Author:
|
|
|
|
Jim Kelly (JimK) May 23, 1991
|
|
|
|
Environment:
|
|
|
|
User Mode
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
[
|
|
uuid(12345778-1234-ABCD-EF00-0123456789AC), //FIX,FIX - Need real uuid
|
|
version(1.0),
|
|
#ifdef __midl
|
|
ms_union,
|
|
#endif // __midl
|
|
pointer_default(unique)
|
|
]
|
|
|
|
interface samr
|
|
|
|
{
|
|
|
|
//
|
|
// Import a dummy interface containing #includes for public .h files. This
|
|
// trick is necessary so that midl will only generate marshalling routines
|
|
// for subtypes that are relevant to the parameters specified on the RPC
|
|
// interface. midl also ingores function prototypes contained therein.
|
|
//
|
|
|
|
import "samimp.idl";
|
|
|
|
|
|
/////////////////////////// TEMPORARY //////////////////////////////////////
|
|
// //
|
|
// I'm tired of fighting MIDL trying to figure out how to import common //
|
|
// definitions for the following data structures. SOOO. I'm just going //
|
|
// to hard-code them in here for a while. //
|
|
// //
|
|
/////////////////////////// TEMPORARY //////////////////////////////////////
|
|
|
|
|
|
//
|
|
// Unicode strings are counted 16-bit character strings.
|
|
// The Length field and MaximumLength fields specify number of bytes,
|
|
// (not wide-characters) in the string. So, this definition differs
|
|
// a bit from the real unicode string type.
|
|
//
|
|
// The Length field does not include a null terminating character
|
|
// if present.
|
|
//
|
|
// NOTE: A null termination character (two bytes of zero), if present,
|
|
// will not be copied with the RPC. It must be explicitly added
|
|
// on the client or server side.
|
|
//
|
|
//
|
|
|
|
typedef struct _RPC_UNICODE_STRING {
|
|
USHORT Length;
|
|
USHORT MaximumLength;
|
|
// [size_is(MaximumLength/sizeof(WCHAR)), length_is(Length/sizeof(WCHAR))] PWCH Buffer;
|
|
[size_is(MaximumLength/2), length_is(Length/2)] PWCH Buffer;
|
|
} RPC_UNICODE_STRING, *PRPC_UNICODE_STRING;
|
|
|
|
|
|
typedef struct _RPC_CYPHER_DATA {
|
|
ULONG Length;
|
|
ULONG MaximumLength;
|
|
[size_is(MaximumLength), length_is(Length)] PCHAR Buffer;
|
|
} RPC_CYPHER_DATA, *PRPC_CYPHER_DATA;
|
|
|
|
|
|
//
|
|
// ANSI counted string
|
|
//
|
|
|
|
typedef struct _RPC_STRING {
|
|
USHORT Length;
|
|
USHORT MaximumLength;
|
|
[size_is(MaximumLength), length_is(Length)] PCHAR Buffer;
|
|
} RPC_STRING, *PRPC_STRING, RPC_ANSI_STRING, *PRPC_ANSI_STRING;
|
|
|
|
|
|
|
|
|
|
|
|
//
|
|
// RPC definition of the SID structure. Note the use of the [size_is()]
|
|
// qualifier to specify the number of elements in the variable size
|
|
// imbedded SubAuthorityCount array at runtime.
|
|
//
|
|
//
|
|
|
|
typedef struct _RPC_SID {
|
|
UCHAR Revision;
|
|
UCHAR SubAuthorityCount;
|
|
SID_IDENTIFIER_AUTHORITY IdentifierAuthority;
|
|
[size_is(SubAuthorityCount)] ULONG SubAuthority[*];
|
|
} RPC_SID, *PRPC_SID, **PPRPC_SID;
|
|
|
|
|
|
|
|
|
|
|
|
////////////////////// END TEMPORARY //////////////////////////////////////
|
|
////////////////////// END TEMPORARY //////////////////////////////////////
|
|
////////////////////// END TEMPORARY //////////////////////////////////////
|
|
|
|
|
|
//
|
|
// SAM Generic Handle used to bind from client to server.
|
|
// This handle is used for both LOCAL and REMOTE services.
|
|
//
|
|
|
|
typedef [handle] LPWSTR PSAMPR_SERVER_NAME;
|
|
|
|
//
|
|
// SAM RPC Context Handle (Internal definition of SAM_HANDLE)
|
|
//
|
|
|
|
typedef [context_handle] PVOID SAMPR_HANDLE;
|
|
|
|
|
|
//
|
|
// Sam enumeration return buffer format
|
|
//
|
|
|
|
typedef struct _SAMPR_RID_ENUMERATION {
|
|
ULONG RelativeId;
|
|
RPC_UNICODE_STRING Name;
|
|
} SAMPR_RID_ENUMERATION, *PSAMPR_RID_ENUMERATION;
|
|
|
|
typedef struct _SAMPR_SID_ENUMERATION {
|
|
PSID Sid;
|
|
RPC_UNICODE_STRING Name;
|
|
} SAMPR_SID_ENUMERATION, *PSAMPR_SID_ENUMERATION;
|
|
|
|
typedef struct _SAMPR_ENUMERATION_BUFFER {
|
|
ULONG EntriesRead;
|
|
[size_is(EntriesRead)] PSAMPR_RID_ENUMERATION Buffer;
|
|
} SAMPR_ENUMERATION_BUFFER, *PSAMPR_ENUMERATION_BUFFER;
|
|
|
|
|
|
|
|
//
|
|
// Used for passing and/or returning self-relative security descriptors
|
|
//
|
|
|
|
typedef struct _SAMPR_SR_SECURITY_DESCRIPTOR {
|
|
ULONG Length;
|
|
[size_is(Length)] PUCHAR SecurityDescriptor;
|
|
} SAMPR_SR_SECURITY_DESCRIPTOR, *PSAMPR_SR_SECURITY_DESCRIPTOR;
|
|
|
|
|
|
|
|
//
|
|
// Sam get groups return buffer format
|
|
//
|
|
|
|
typedef struct _SAMPR_GET_GROUPS_BUFFER {
|
|
ULONG MembershipCount;
|
|
[size_is(MembershipCount)] PGROUP_MEMBERSHIP Groups;
|
|
} SAMPR_GET_GROUPS_BUFFER, *PSAMPR_GET_GROUPS_BUFFER;
|
|
|
|
|
|
//
|
|
// Sam get members in group return buffer format
|
|
//
|
|
|
|
typedef struct _SAMPR_GET_MEMBERS_BUFFER {
|
|
ULONG MemberCount;
|
|
[size_is(MemberCount)] PULONG Members;
|
|
[size_is(MemberCount)] PULONG Attributes;
|
|
} SAMPR_GET_MEMBERS_BUFFER, *PSAMPR_GET_MEMBERS_BUFFER;
|
|
|
|
|
|
//
|
|
// Logon hours points to an array of bytes that varies in length
|
|
// depending upon how many units per-week are specified.
|
|
//
|
|
|
|
typedef struct _SAMPR_LOGON_HOURS {
|
|
|
|
USHORT UnitsPerWeek;
|
|
|
|
//
|
|
// Points to an array of bitmask.
|
|
// The bits represent either days, hours or minutes in the week
|
|
// depending upon the value of UnitsPerWeek. (Technically, they
|
|
// could represent any division of time not finer than minute
|
|
// granularity).
|
|
// Day granularity is specified by specifying SAM_DAYS_PER_WEEK.
|
|
// Hours granularity is specified by specifying SAM_HOURS_PER_WEEK.
|
|
// Minute granularity is specified by specifying SAM_MINUTES_PER_WEEK.
|
|
// The number of bytes pointed to by this field is
|
|
// ((UnitsPerWeek + 7) / 8) and may not exceed
|
|
// ((SAM_MINUTES_PER_WEEK+7)/8 == 1260).
|
|
//
|
|
|
|
[size_is(1260), length_is((UnitsPerWeek+7)/8)] PUCHAR LogonHours;
|
|
|
|
} SAMPR_LOGON_HOURS, *PSAMPR_LOGON_HOURS;
|
|
|
|
|
|
|
|
|
|
typedef struct _SAMPR_ULONG_ARRAY {
|
|
|
|
//
|
|
// Indicates the number of Elements in the array.
|
|
//
|
|
|
|
ULONG Count;
|
|
|
|
//
|
|
// Normally, the client wrapper wants to set this to NULL
|
|
// before calling the stub. This causes the client stub
|
|
// to allocate a buffe for the returned information which
|
|
// can be passed back to the caller of the wrapper routine.
|
|
//
|
|
|
|
[size_is(Count)] ULONG * Element;
|
|
|
|
} SAMPR_ULONG_ARRAY, *PSAMPR_ULONG_ARRAY;
|
|
|
|
|
|
//
|
|
// We must hide the PSID in a structure to avoid too many *'s in a
|
|
// field that uses size_is - otherwise MIDL has a fit.
|
|
//
|
|
|
|
typedef struct _SAMPR_SID_INFORMATION {
|
|
|
|
PRPC_SID SidPointer;
|
|
|
|
} SAMPR_SID_INFORMATION, *PSAMPR_SID_INFORMATION;
|
|
|
|
|
|
//
|
|
// Define an array of pointers to SIDs
|
|
//
|
|
|
|
typedef struct _SAMPR_PSID_ARRAY {
|
|
|
|
//
|
|
// Indicates the number of Elements in the array.
|
|
//
|
|
|
|
ULONG Count;
|
|
|
|
//
|
|
// Points to the array of sid-pointers
|
|
//
|
|
|
|
[size_is(Count)] PSAMPR_SID_INFORMATION Sids;
|
|
|
|
} SAMPR_PSID_ARRAY, *PSAMPR_PSID_ARRAY;
|
|
|
|
|
|
//
|
|
// The following structure is used to receive (as an out parameter) a list
|
|
// of relative IDs (or other ULONGS). This structure is necessary because
|
|
// RPC needs the count to be in the same structure as the returned ULONGs.
|
|
// A wrapper routine is expected to initialize this structure on its stack
|
|
// and pass its address.
|
|
//
|
|
// WARNING: before passing this structure to an RPC stub, the UlongArrayBuffer
|
|
// field must be set to NULL. This causes the stub to allocate
|
|
// the return buffer.
|
|
//
|
|
|
|
//typedef struct _SAMPR_RETURNED_ULONG_ARRAY {
|
|
// ULONG Count;
|
|
// [size_is(Count)] ULONG * UlongArrayBuffer; // Set to NULL before call !!!
|
|
//} SAMPR_RETURNED_ULONG_ARRAY, *PSAMPR_RETURNED_ULONG_ARRAY;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
typedef struct _SAMPR_UNICODE_STRING_ARRAY {
|
|
|
|
//
|
|
// Indicates the number of Elements in the array.
|
|
//
|
|
|
|
ULONG Count;
|
|
|
|
//
|
|
// Normally, the client wrapper wants to set this to NULL
|
|
// before calling the stub. This causes the client stub
|
|
// to allocate a buffer for the returned information which
|
|
// can be passed back to the caller of the wrapper routine.
|
|
//
|
|
|
|
[size_is(Count)] RPC_UNICODE_STRING * Element;
|
|
|
|
} SAMPR_UNICODE_STRING_ARRAY, *PSAMPR_UNICODE_STRING_ARRAY;
|
|
|
|
|
|
|
|
|
|
//
|
|
// The allocation scheme used on the client side and server side is
|
|
// different when a list of unicode string names is to be returned.
|
|
// The server wants to be able to return multiple allocation
|
|
// blocks and the client only wants to have to worry about freeing a single
|
|
// allocation block.
|
|
//
|
|
// To accomplish this, a notion of unicode name arrays are introduced.
|
|
// one representing an array passed by a client and another representing
|
|
// an array returned by a server. Then, a client .acf file is used to get
|
|
// these to look correct when generating client stubs and a server .acf
|
|
// file is used to get them to be correct for the server when generating
|
|
// the server stubs.
|
|
//
|
|
|
|
|
|
typedef RPC_UNICODE_STRING SAMPR_RETURNED_STRING;
|
|
typedef RPC_UNICODE_STRING *PSAMPR_RETURNED_STRING;
|
|
|
|
typedef STRING SAMPR_RETURNED_NORMAL_STRING;
|
|
typedef STRING *PSAMPR_RETURNED_NORMAL_STRING;
|
|
|
|
|
|
|
|
//
|
|
// The following structure is used to receive (as an out parameter) a list
|
|
// of unicode string names. This structure is necessary because
|
|
// RPC needs the count to be in the same structure as the returned names.
|
|
// A wrapper routine is expected to initialize this structure on its stack
|
|
// and pass its address.
|
|
//
|
|
// WARNING: before passing this structure to an RPC stub, the UnameArrayBuffer
|
|
// field must be set to NULL. This causes the stub to allocate
|
|
// the return buffer.
|
|
//
|
|
|
|
typedef struct _SAMPR_RETURNED_USTRING_ARRAY {
|
|
ULONG Count;
|
|
[size_is(Count)] PSAMPR_RETURNED_STRING Element; // Set to NULL before call !!!
|
|
} SAMPR_RETURNED_USTRING_ARRAY, *PSAMPR_RETURNED_USTRING_ARRAY;
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
// //
|
|
// Server Object Related RPC Definitions //
|
|
// //
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
// (None)
|
|
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
// //
|
|
// Domain Object Related RPC Definitions //
|
|
// //
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
#pragma pack(4)
|
|
typedef struct _SAMPR_DOMAIN_GENERAL_INFORMATION {
|
|
OLD_LARGE_INTEGER ForceLogoff;
|
|
RPC_UNICODE_STRING OemInformation;
|
|
RPC_UNICODE_STRING DomainName;
|
|
RPC_UNICODE_STRING ReplicaSourceNodeName;
|
|
OLD_LARGE_INTEGER DomainModifiedCount;
|
|
ULONG DomainServerState;
|
|
ULONG DomainServerRole;
|
|
BOOLEAN UasCompatibilityRequired;
|
|
ULONG UserCount;
|
|
ULONG GroupCount;
|
|
ULONG AliasCount;
|
|
} SAMPR_DOMAIN_GENERAL_INFORMATION, *PSAMPR_DOMAIN_GENERAL_INFORMATION;
|
|
#pragma pack()
|
|
|
|
#pragma pack(4)
|
|
typedef struct _SAMPR_DOMAIN_GENERAL_INFORMATION2 {
|
|
SAMPR_DOMAIN_GENERAL_INFORMATION I1;
|
|
|
|
//
|
|
// New fields added for this structure (NT1.0A).
|
|
//
|
|
|
|
#if defined(MIDL_PASS)
|
|
OLD_LARGE_INTEGER LockoutDuration; //Must be a Delta time
|
|
OLD_LARGE_INTEGER LockoutObservationWindow; //Must be a Delta time
|
|
#else
|
|
LARGE_INTEGER LockoutDuration; //Must be a Delta time
|
|
LARGE_INTEGER LockoutObservationWindow; //Must be a Delta time
|
|
#endif
|
|
USHORT LockoutThreshold;
|
|
|
|
} SAMPR_DOMAIN_GENERAL_INFORMATION2, *PSAMPR_DOMAIN_GENERAL_INFORMATION2;
|
|
#pragma pack()
|
|
|
|
typedef struct _SAMPR_DOMAIN_OEM_INFORMATION {
|
|
RPC_UNICODE_STRING OemInformation;
|
|
} SAMPR_DOMAIN_OEM_INFORMATION, *PSAMPR_DOMAIN_OEM_INFORMATION;
|
|
|
|
typedef struct _SAMPR_DOMAIN_NAME_INFORMATION {
|
|
RPC_UNICODE_STRING DomainName;
|
|
} SAMPR_DOMAIN_NAME_INFORMATION, *PSAMPR_DOMAIN_NAME_INFORMATION;
|
|
|
|
|
|
typedef struct SAMPR_DOMAIN_REPLICATION_INFORMATION {
|
|
RPC_UNICODE_STRING ReplicaSourceNodeName;
|
|
} SAMPR_DOMAIN_REPLICATION_INFORMATION, *PSAMPR_DOMAIN_REPLICATION_INFORMATION;
|
|
|
|
typedef struct _SAMPR_DOMAIN_LOCKOUT_INFORMATION {
|
|
#if defined(MIDL_PASS)
|
|
OLD_LARGE_INTEGER LockoutDuration; //Must be a Delta time
|
|
OLD_LARGE_INTEGER LockoutObservationWindow; //Must be a Delta time
|
|
#else
|
|
LARGE_INTEGER LockoutDuration; //Must be a Delta time
|
|
LARGE_INTEGER LockoutObservationWindow; //Must be a Delta time
|
|
#endif
|
|
USHORT LockoutThreshold; //Zero means no lockout
|
|
} SAMPR_DOMAIN_LOCKOUT_INFORMATION, *PSAMPR_DOMAIN_LOCKOUT_INFORMATION;
|
|
|
|
|
|
typedef [switch_type(DOMAIN_INFORMATION_CLASS)] union
|
|
_SAMPR_DOMAIN_INFO_BUFFER {
|
|
[case(DomainPasswordInformation)] DOMAIN_PASSWORD_INFORMATION Password;
|
|
[case(DomainGeneralInformation)] SAMPR_DOMAIN_GENERAL_INFORMATION General;
|
|
[case(DomainLogoffInformation)] DOMAIN_LOGOFF_INFORMATION Logoff;
|
|
[case(DomainOemInformation)] SAMPR_DOMAIN_OEM_INFORMATION Oem;
|
|
[case(DomainNameInformation)] SAMPR_DOMAIN_NAME_INFORMATION Name;
|
|
[case(DomainServerRoleInformation)] DOMAIN_SERVER_ROLE_INFORMATION Role;
|
|
[case(DomainReplicationInformation)] SAMPR_DOMAIN_REPLICATION_INFORMATION Replication;
|
|
[case(DomainModifiedInformation)] DOMAIN_MODIFIED_INFORMATION Modified;
|
|
[case(DomainStateInformation)] DOMAIN_STATE_INFORMATION State;
|
|
[case(DomainGeneralInformation2)] SAMPR_DOMAIN_GENERAL_INFORMATION2 General2;
|
|
[case(DomainLockoutInformation)] SAMPR_DOMAIN_LOCKOUT_INFORMATION Lockout;
|
|
[case(DomainModifiedInformation2)] DOMAIN_MODIFIED_INFORMATION2 Modified2;
|
|
} SAMPR_DOMAIN_INFO_BUFFER, *PSAMPR_DOMAIN_INFO_BUFFER;
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
// //
|
|
// Group Object Related Definitions //
|
|
// //
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
typedef struct _SAMPR_GROUP_GENERAL_INFORMATION {
|
|
RPC_UNICODE_STRING Name;
|
|
ULONG Attributes;
|
|
ULONG MemberCount;
|
|
RPC_UNICODE_STRING AdminComment;
|
|
} SAMPR_GROUP_GENERAL_INFORMATION, *PSAMPR_GROUP_GENERAL_INFORMATION;
|
|
|
|
typedef struct _SAMPR_GROUP_NAME_INFORMATION {
|
|
RPC_UNICODE_STRING Name;
|
|
} SAMPR_GROUP_NAME_INFORMATION, *PSAMPR_GROUP_NAME_INFORMATION;
|
|
|
|
|
|
typedef struct _SAMPR_GROUP_ADM_COMMENT_INFORMATION {
|
|
RPC_UNICODE_STRING AdminComment;
|
|
} SAMPR_GROUP_ADM_COMMENT_INFORMATION, *PSAMPR_GROUP_ADM_COMMENT_INFORMATION;
|
|
|
|
|
|
|
|
typedef [switch_type(GROUP_INFORMATION_CLASS)] union
|
|
_SAMPR_GROUP_INFO_BUFFER {
|
|
[case(GroupGeneralInformation)] SAMPR_GROUP_GENERAL_INFORMATION General;
|
|
[case(GroupNameInformation)] SAMPR_GROUP_NAME_INFORMATION Name;
|
|
[case(GroupAttributeInformation)] GROUP_ATTRIBUTE_INFORMATION Attribute;
|
|
[case(GroupAdminCommentInformation)] SAMPR_GROUP_ADM_COMMENT_INFORMATION AdminComment;
|
|
} SAMPR_GROUP_INFO_BUFFER, *PSAMPR_GROUP_INFO_BUFFER;
|
|
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
// //
|
|
// Alias Object Related Definitions //
|
|
// //
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
typedef struct _SAMPR_ALIAS_GENERAL_INFORMATION {
|
|
RPC_UNICODE_STRING Name;
|
|
ULONG MemberCount;
|
|
RPC_UNICODE_STRING AdminComment;
|
|
} SAMPR_ALIAS_GENERAL_INFORMATION, *PSAMPR_ALIAS_GENERAL_INFORMATION;
|
|
|
|
typedef struct _SAMPR_ALIAS_NAME_INFORMATION {
|
|
RPC_UNICODE_STRING Name;
|
|
} SAMPR_ALIAS_NAME_INFORMATION, *PSAMPR_ALIAS_NAME_INFORMATION;
|
|
|
|
|
|
typedef struct _SAMPR_ALIAS_ADM_COMMENT_INFORMATION {
|
|
RPC_UNICODE_STRING AdminComment;
|
|
} SAMPR_ALIAS_ADM_COMMENT_INFORMATION, *PSAMPR_ALIAS_ADM_COMMENT_INFORMATION;
|
|
|
|
|
|
|
|
typedef [switch_type(ALIAS_INFORMATION_CLASS)] union
|
|
_SAMPR_ALIAS_INFO_BUFFER {
|
|
[case(AliasGeneralInformation)] SAMPR_ALIAS_GENERAL_INFORMATION General;
|
|
[case(AliasNameInformation)] SAMPR_ALIAS_NAME_INFORMATION Name;
|
|
[case(AliasAdminCommentInformation)] SAMPR_ALIAS_ADM_COMMENT_INFORMATION AdminComment;
|
|
} SAMPR_ALIAS_INFO_BUFFER, *PSAMPR_ALIAS_INFO_BUFFER;
|
|
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
// //
|
|
// User Object Related Definitions //
|
|
// //
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
#pragma pack(4)
|
|
typedef struct _SAMPR_USER_ALL_INFORMATION {
|
|
OLD_LARGE_INTEGER LastLogon;
|
|
OLD_LARGE_INTEGER LastLogoff;
|
|
OLD_LARGE_INTEGER PasswordLastSet;
|
|
OLD_LARGE_INTEGER AccountExpires;
|
|
OLD_LARGE_INTEGER PasswordCanChange;
|
|
OLD_LARGE_INTEGER PasswordMustChange;
|
|
RPC_UNICODE_STRING UserName;
|
|
RPC_UNICODE_STRING FullName;
|
|
RPC_UNICODE_STRING HomeDirectory;
|
|
RPC_UNICODE_STRING HomeDirectoryDrive;
|
|
RPC_UNICODE_STRING ScriptPath;
|
|
RPC_UNICODE_STRING ProfilePath;
|
|
RPC_UNICODE_STRING AdminComment;
|
|
RPC_UNICODE_STRING WorkStations;
|
|
RPC_UNICODE_STRING UserComment;
|
|
RPC_UNICODE_STRING Parameters;
|
|
RPC_UNICODE_STRING LmOwfPassword;
|
|
RPC_UNICODE_STRING NtOwfPassword;
|
|
RPC_UNICODE_STRING PrivateData;
|
|
SAMPR_SR_SECURITY_DESCRIPTOR SecurityDescriptor;
|
|
ULONG UserId;
|
|
ULONG PrimaryGroupId;
|
|
ULONG UserAccountControl;
|
|
ULONG WhichFields;
|
|
SAMPR_LOGON_HOURS LogonHours;
|
|
USHORT BadPasswordCount;
|
|
USHORT LogonCount;
|
|
USHORT CountryCode;
|
|
USHORT CodePage;
|
|
BOOLEAN LmPasswordPresent;
|
|
BOOLEAN NtPasswordPresent;
|
|
BOOLEAN PasswordExpired;
|
|
BOOLEAN PrivateDataSensitive;
|
|
} SAMPR_USER_ALL_INFORMATION, *PSAMPR_USER_ALL_INFORMATION;
|
|
#pragma pack()
|
|
|
|
#pragma pack(4)
|
|
typedef struct _SAMPR_USER_INTERNAL3_INFORMATION {
|
|
SAMPR_USER_ALL_INFORMATION I1;
|
|
#if defined(MIDL_PASS)
|
|
OLD_LARGE_INTEGER LastBadPasswordTime;
|
|
#else
|
|
LARGE_INTEGER LastBadPasswordTime;
|
|
#endif
|
|
} SAMPR_USER_INTERNAL3_INFORMATION, *PSAMPR_USER_INTERNAL3_INFORMATION;
|
|
#pragma pack()
|
|
|
|
|
|
typedef struct _SAMPR_USER_GENERAL_INFORMATION {
|
|
RPC_UNICODE_STRING UserName;
|
|
RPC_UNICODE_STRING FullName;
|
|
ULONG PrimaryGroupId;
|
|
RPC_UNICODE_STRING AdminComment;
|
|
RPC_UNICODE_STRING UserComment;
|
|
} SAMPR_USER_GENERAL_INFORMATION, *PSAMPR_USER_GENERAL_INFORMATION;
|
|
|
|
typedef struct _SAMPR_USER_PREFERENCES_INFORMATION {
|
|
RPC_UNICODE_STRING UserComment;
|
|
RPC_UNICODE_STRING Reserved1;
|
|
USHORT CountryCode;
|
|
USHORT CodePage;
|
|
} SAMPR_USER_PREFERENCES_INFORMATION, *PSAMPR_USER_PREFERENCES_INFORMATION;
|
|
|
|
typedef struct _SAMPR_USER_PARAMETERS_INFORMATION {
|
|
RPC_UNICODE_STRING Parameters;
|
|
} SAMPR_USER_PARAMETERS_INFORMATION, *PSAMPR_USER_PARAMETERS_INFORMATION;
|
|
|
|
#pragma pack(4)
|
|
typedef struct _SAMPR_USER_LOGON_INFORMATION {
|
|
RPC_UNICODE_STRING UserName;
|
|
RPC_UNICODE_STRING FullName;
|
|
ULONG UserId;
|
|
ULONG PrimaryGroupId;
|
|
RPC_UNICODE_STRING HomeDirectory;
|
|
RPC_UNICODE_STRING HomeDirectoryDrive;
|
|
RPC_UNICODE_STRING ScriptPath;
|
|
RPC_UNICODE_STRING ProfilePath;
|
|
RPC_UNICODE_STRING WorkStations;
|
|
OLD_LARGE_INTEGER LastLogon;
|
|
OLD_LARGE_INTEGER LastLogoff;
|
|
OLD_LARGE_INTEGER PasswordLastSet;
|
|
OLD_LARGE_INTEGER PasswordCanChange;
|
|
OLD_LARGE_INTEGER PasswordMustChange;
|
|
SAMPR_LOGON_HOURS LogonHours;
|
|
USHORT BadPasswordCount;
|
|
USHORT LogonCount;
|
|
ULONG UserAccountControl;
|
|
} SAMPR_USER_LOGON_INFORMATION, *PSAMPR_USER_LOGON_INFORMATION;
|
|
#pragma pack()
|
|
|
|
#pragma pack(4)
|
|
typedef struct _SAMPR_USER_ACCOUNT_INFORMATION {
|
|
RPC_UNICODE_STRING UserName;
|
|
RPC_UNICODE_STRING FullName;
|
|
ULONG UserId;
|
|
ULONG PrimaryGroupId;
|
|
RPC_UNICODE_STRING HomeDirectory;
|
|
RPC_UNICODE_STRING HomeDirectoryDrive;
|
|
RPC_UNICODE_STRING ScriptPath;
|
|
RPC_UNICODE_STRING ProfilePath;
|
|
RPC_UNICODE_STRING AdminComment;
|
|
RPC_UNICODE_STRING WorkStations;
|
|
OLD_LARGE_INTEGER LastLogon;
|
|
OLD_LARGE_INTEGER LastLogoff;
|
|
SAMPR_LOGON_HOURS LogonHours;
|
|
USHORT BadPasswordCount;
|
|
USHORT LogonCount;
|
|
OLD_LARGE_INTEGER PasswordLastSet;
|
|
OLD_LARGE_INTEGER AccountExpires;
|
|
ULONG UserAccountControl;
|
|
} SAMPR_USER_ACCOUNT_INFORMATION, *PSAMPR_USER_ACCOUNT_INFORMATION;
|
|
#pragma pack()
|
|
|
|
typedef struct _SAMPR_USER_A_NAME_INFORMATION {
|
|
RPC_UNICODE_STRING UserName;
|
|
} SAMPR_USER_A_NAME_INFORMATION, *PSAMPR_USER_A_NAME_INFORMATION;
|
|
|
|
typedef struct _SAMPR_USER_F_NAME_INFORMATION {
|
|
RPC_UNICODE_STRING FullName;
|
|
} SAMPR_USER_F_NAME_INFORMATION, *PSAMPR_USER_F_NAME_INFORMATION;
|
|
|
|
typedef struct _SAMPR_USER_NAME_INFORMATION {
|
|
RPC_UNICODE_STRING UserName;
|
|
RPC_UNICODE_STRING FullName;
|
|
} SAMPR_USER_NAME_INFORMATION, *PSAMPR_USER_NAME_INFORMATION;
|
|
|
|
typedef struct _SAMPR_USER_HOME_INFORMATION {
|
|
RPC_UNICODE_STRING HomeDirectory;
|
|
RPC_UNICODE_STRING HomeDirectoryDrive;
|
|
} SAMPR_USER_HOME_INFORMATION, *PSAMPR_USER_HOME_INFORMATION;
|
|
|
|
typedef struct _SAMPR_USER_SCRIPT_INFORMATION {
|
|
RPC_UNICODE_STRING ScriptPath;
|
|
} SAMPR_USER_SCRIPT_INFORMATION, *PSAMPR_USER_SCRIPT_INFORMATION;
|
|
|
|
typedef struct _SAMPR_USER_PROFILE_INFORMATION {
|
|
RPC_UNICODE_STRING ProfilePath;
|
|
} SAMPR_USER_PROFILE_INFORMATION, *PSAMPR_USER_PROFILE_INFORMATION;
|
|
|
|
typedef struct _SAMPR_USER_ADMIN_COMMENT_INFORMATION {
|
|
RPC_UNICODE_STRING AdminComment;
|
|
} SAMPR_USER_ADMIN_COMMENT_INFORMATION, *PSAMPR_USER_ADMIN_COMMENT_INFORMATION;
|
|
|
|
typedef struct _SAMPR_USER_WORKSTATIONS_INFORMATION {
|
|
RPC_UNICODE_STRING WorkStations;
|
|
} SAMPR_USER_WORKSTATIONS_INFORMATION, *PSAMPR_USER_WORKSTATIONS_INFORMATION;
|
|
|
|
typedef struct _SAMPR_USER_LOGON_HOURS_INFORMATION {
|
|
SAMPR_LOGON_HOURS LogonHours;
|
|
} SAMPR_USER_LOGON_HOURS_INFORMATION, *PSAMPR_USER_LOGON_HOURS_INFORMATION;
|
|
|
|
typedef struct _SAMPR_USER_INTERNAL1_INFORMATION {
|
|
ENCRYPTED_NT_OWF_PASSWORD EncryptedNtOwfPassword;
|
|
ENCRYPTED_LM_OWF_PASSWORD EncryptedLmOwfPassword;
|
|
BOOLEAN NtPasswordPresent;
|
|
BOOLEAN LmPasswordPresent;
|
|
BOOLEAN PasswordExpired;
|
|
} SAMPR_USER_INTERNAL1_INFORMATION, *PSAMPR_USER_INTERNAL1_INFORMATION;
|
|
|
|
|
|
typedef struct _SAMPR_USER_INTERNAL4_INFORMATION {
|
|
SAMPR_USER_ALL_INFORMATION I1;
|
|
SAMPR_ENCRYPTED_USER_PASSWORD UserPassword;
|
|
} SAMPR_USER_INTERNAL4_INFORMATION, *PSAMPR_USER_INTERNAL4_INFORMATION;
|
|
|
|
typedef struct _SAMPR_USER_INTERNAL5_INFORMATION {
|
|
SAMPR_ENCRYPTED_USER_PASSWORD UserPassword;
|
|
BOOLEAN PasswordExpired;
|
|
} SAMPR_USER_INTERNAL5_INFORMATION, *PSAMPR_USER_INTERNAL5_INFORMATION;
|
|
|
|
|
|
typedef [switch_type(USER_INFORMATION_CLASS)] union
|
|
_SAMPR_USER_INFO_BUFFER {
|
|
[case(UserGeneralInformation)] SAMPR_USER_GENERAL_INFORMATION General;
|
|
[case(UserPreferencesInformation)] SAMPR_USER_PREFERENCES_INFORMATION Preferences;
|
|
[case(UserLogonInformation)] SAMPR_USER_LOGON_INFORMATION Logon;
|
|
[case(UserLogonHoursInformation)] SAMPR_USER_LOGON_HOURS_INFORMATION LogonHours;
|
|
[case(UserAccountInformation)] SAMPR_USER_ACCOUNT_INFORMATION Account;
|
|
[case(UserNameInformation)] SAMPR_USER_NAME_INFORMATION Name;
|
|
[case(UserAccountNameInformation)] SAMPR_USER_A_NAME_INFORMATION AccountName;
|
|
[case(UserFullNameInformation)] SAMPR_USER_F_NAME_INFORMATION FullName;
|
|
[case(UserPrimaryGroupInformation)] USER_PRIMARY_GROUP_INFORMATION PrimaryGroup;
|
|
[case(UserHomeInformation)] SAMPR_USER_HOME_INFORMATION Home;
|
|
[case(UserScriptInformation)] SAMPR_USER_SCRIPT_INFORMATION Script;
|
|
[case(UserProfileInformation)] SAMPR_USER_PROFILE_INFORMATION Profile;
|
|
[case(UserAdminCommentInformation)] SAMPR_USER_ADMIN_COMMENT_INFORMATION AdminComment;
|
|
[case(UserWorkStationsInformation)] SAMPR_USER_WORKSTATIONS_INFORMATION WorkStations;
|
|
[case(UserControlInformation)] USER_CONTROL_INFORMATION Control;
|
|
[case(UserExpiresInformation)] USER_EXPIRES_INFORMATION Expires;
|
|
[case(UserInternal1Information)] SAMPR_USER_INTERNAL1_INFORMATION Internal1;
|
|
[case(UserInternal2Information)] USER_INTERNAL2_INFORMATION Internal2;
|
|
[case(UserParametersInformation)] SAMPR_USER_PARAMETERS_INFORMATION Parameters;
|
|
[case(UserAllInformation)] SAMPR_USER_ALL_INFORMATION All;
|
|
[case(UserInternal3Information)] SAMPR_USER_INTERNAL3_INFORMATION Internal3;
|
|
[case(UserInternal4Information)] SAMPR_USER_INTERNAL4_INFORMATION Internal4;
|
|
[case(UserInternal5Information)] SAMPR_USER_INTERNAL5_INFORMATION Internal5;
|
|
} SAMPR_USER_INFO_BUFFER, *PSAMPR_USER_INFO_BUFFER;
|
|
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
// //
|
|
// Domain display information Related Definitions //
|
|
// //
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
typedef struct _SAMPR_DOMAIN_DISPLAY_USER {
|
|
ULONG Index;
|
|
ULONG Rid;
|
|
ULONG AccountControl;
|
|
SAMPR_RETURNED_STRING LogonName;
|
|
SAMPR_RETURNED_STRING AdminComment;
|
|
SAMPR_RETURNED_STRING FullName;
|
|
} SAMPR_DOMAIN_DISPLAY_USER, *PSAMPR_DOMAIN_DISPLAY_USER;
|
|
|
|
typedef struct _SAMPR_DOMAIN_DISPLAY_MACHINE {
|
|
ULONG Index;
|
|
ULONG Rid;
|
|
ULONG AccountControl;
|
|
SAMPR_RETURNED_STRING Machine;
|
|
SAMPR_RETURNED_STRING Comment;
|
|
} SAMPR_DOMAIN_DISPLAY_MACHINE, *PSAMPR_DOMAIN_DISPLAY_MACHINE;
|
|
|
|
typedef struct _SAMPR_DOMAIN_DISPLAY_GROUP { // Added for NT1.0A
|
|
ULONG Index;
|
|
ULONG Rid;
|
|
ULONG Attributes;
|
|
SAMPR_RETURNED_STRING Group;
|
|
SAMPR_RETURNED_STRING Comment;
|
|
} SAMPR_DOMAIN_DISPLAY_GROUP, *PSAMPR_DOMAIN_DISPLAY_GROUP;
|
|
|
|
typedef struct _SAMPR_DOMAIN_DISPLAY_OEM_USER { // Added for NT1.0A
|
|
ULONG Index;
|
|
SAMPR_RETURNED_NORMAL_STRING OemUser;
|
|
} SAMPR_DOMAIN_DISPLAY_OEM_USER, *PSAMPR_DOMAIN_DISPLAY_OEM_USER;
|
|
|
|
typedef struct _SAMPR_DOMAIN_DISPLAY_OEM_GROUP { // Added for NT1.0A
|
|
ULONG Index;
|
|
SAMPR_RETURNED_NORMAL_STRING OemGroup;
|
|
} SAMPR_DOMAIN_DISPLAY_OEM_GROUP, *PSAMPR_DOMAIN_DISPLAY_OEM_GROUP;
|
|
|
|
|
|
typedef struct _SAMPR_DOMAIN_DISPLAY_USER_BUFFER {
|
|
ULONG EntriesRead;
|
|
[size_is(EntriesRead)] PSAMPR_DOMAIN_DISPLAY_USER Buffer;
|
|
} SAMPR_DOMAIN_DISPLAY_USER_BUFFER, *PSAMPR_DOMAIN_DISPLAY_USER_BUFFER;
|
|
|
|
|
|
typedef struct _SAMPR_DOMAIN_DISPLAY_MACHINE_BUFFER {
|
|
ULONG EntriesRead;
|
|
[size_is(EntriesRead)] PSAMPR_DOMAIN_DISPLAY_MACHINE Buffer;
|
|
} SAMPR_DOMAIN_DISPLAY_MACHINE_BUFFER, *PSAMPR_DOMAIN_DISPLAY_MACHINE_BUFFER;
|
|
|
|
typedef struct _SAMPR_DOMAIN_DISPLAY_GROUP_BUFFER { // Added for NT1.0A
|
|
ULONG EntriesRead;
|
|
[size_is(EntriesRead)] PSAMPR_DOMAIN_DISPLAY_GROUP Buffer;
|
|
} SAMPR_DOMAIN_DISPLAY_GROUP_BUFFER, *PSAMPR_DOMAIN_DISPLAY_GROUP_BUFFER;
|
|
|
|
typedef struct _SAMPR_DOMAIN_DISPLAY_OEM_USER_BUFFER { // Added for NT1.0A
|
|
ULONG EntriesRead;
|
|
[size_is(EntriesRead)] PSAMPR_DOMAIN_DISPLAY_OEM_USER Buffer;
|
|
} SAMPR_DOMAIN_DISPLAY_OEM_USER_BUFFER, *PSAMPR_DOMAIN_DISPLAY_OEM_USER_BUFFER;
|
|
|
|
|
|
typedef struct _SAMPR_DOMAIN_DISPLAY_OEM_GROUP_BUFFER { // Added for NT1.0A
|
|
ULONG EntriesRead;
|
|
[size_is(EntriesRead)] PSAMPR_DOMAIN_DISPLAY_OEM_GROUP Buffer;
|
|
} SAMPR_DOMAIN_DISPLAY_OEM_GROUP_BUFFER, *PSAMPR_DOMAIN_DISPLAY_OEM_GROUP_BUFFER;
|
|
|
|
|
|
|
|
typedef [switch_type(DOMAIN_DISPLAY_INFORMATION)] union
|
|
_SAMPR_DISPLAY_INFO_BUFFER {
|
|
[case(DomainDisplayUser)] SAMPR_DOMAIN_DISPLAY_USER_BUFFER UserInformation;
|
|
[case(DomainDisplayMachine)] SAMPR_DOMAIN_DISPLAY_MACHINE_BUFFER MachineInformation;
|
|
[case(DomainDisplayGroup)] SAMPR_DOMAIN_DISPLAY_GROUP_BUFFER GroupInformation;
|
|
[case(DomainDisplayOemUser)] SAMPR_DOMAIN_DISPLAY_OEM_USER_BUFFER OemUserInformation;
|
|
[case(DomainDisplayOemGroup)] SAMPR_DOMAIN_DISPLAY_OEM_GROUP_BUFFER OemGroupInformation;
|
|
} SAMPR_DISPLAY_INFO_BUFFER, *PSAMPR_DISPLAY_INFO_BUFFER;
|
|
|
|
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
// //
|
|
// APIs Exported By SAM //
|
|
// //
|
|
// Note that MIDL will prefix each of these routine names with the //
|
|
// interface name. So, we will end up with names like Samr_Connect(). //
|
|
// //
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
NTSTATUS
|
|
SamrConnect(
|
|
[in,unique] PSAMPR_SERVER_NAME ServerName,
|
|
[out] SAMPR_HANDLE * ServerHandle,
|
|
[in] ACCESS_MASK DesiredAccess
|
|
);
|
|
|
|
NTSTATUS
|
|
SamrCloseHandle(
|
|
[in,out] SAMPR_HANDLE * SamHandle
|
|
);
|
|
|
|
|
|
NTSTATUS
|
|
SamrSetSecurityObject(
|
|
[in] SAMPR_HANDLE ObjectHandle,
|
|
[in] SECURITY_INFORMATION SecurityInformation,
|
|
[in] PSAMPR_SR_SECURITY_DESCRIPTOR SecurityDescriptor
|
|
);
|
|
|
|
NTSTATUS
|
|
SamrQuerySecurityObject(
|
|
[in] SAMPR_HANDLE ObjectHandle,
|
|
[in] SECURITY_INFORMATION SecurityInformation,
|
|
[out] PSAMPR_SR_SECURITY_DESCRIPTOR *SecurityDescriptor
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
//
|
|
// Server related API
|
|
//
|
|
|
|
NTSTATUS
|
|
SamrShutdownSamServer(
|
|
[in] SAMPR_HANDLE ServerHandle
|
|
);
|
|
|
|
|
|
NTSTATUS
|
|
SamrLookupDomainInSamServer(
|
|
[in] SAMPR_HANDLE ServerHandle,
|
|
[in] PRPC_UNICODE_STRING Name,
|
|
[out] PRPC_SID * DomainId
|
|
);
|
|
|
|
NTSTATUS
|
|
SamrEnumerateDomainsInSamServer(
|
|
[in] SAMPR_HANDLE ServerHandle,
|
|
[in,out] PSAM_ENUMERATE_HANDLE EnumerationContext,
|
|
[out] PSAMPR_ENUMERATION_BUFFER *Buffer,
|
|
[in] ULONG PreferedMaximumLength,
|
|
[out] PULONG CountReturned
|
|
);
|
|
|
|
|
|
|
|
//
|
|
// Domain related API
|
|
//
|
|
|
|
NTSTATUS
|
|
SamrOpenDomain(
|
|
[in] SAMPR_HANDLE ServerHandle,
|
|
[in] ACCESS_MASK DesiredAccess,
|
|
[in] PRPC_SID DomainId,
|
|
[out] SAMPR_HANDLE * DomainHandle
|
|
);
|
|
|
|
//
|
|
// Don't call the following api with an InfoClass level beyond
|
|
// DomainUasInformation. This is the highest info level supported
|
|
// in NT1.0, and RPC didn't raise an exception when an invalid
|
|
// info level was passed, so the server side stub tries to unmarshal
|
|
// the [out] parameter (which isn't there) and can access violate.
|
|
//
|
|
// CALL SamrQueryInformationDomain2() instead (see end of this file)
|
|
//
|
|
|
|
NTSTATUS
|
|
SamrQueryInformationDomain(
|
|
[in] SAMPR_HANDLE DomainHandle,
|
|
[in] DOMAIN_INFORMATION_CLASS DomainInformationClass,
|
|
[out, switch_is(DomainInformationClass)]
|
|
PSAMPR_DOMAIN_INFO_BUFFER *Buffer
|
|
);
|
|
|
|
NTSTATUS
|
|
SamrSetInformationDomain(
|
|
[in] SAMPR_HANDLE DomainHandle,
|
|
[in] DOMAIN_INFORMATION_CLASS DomainInformationClass,
|
|
[in, switch_is(DomainInformationClass)]
|
|
PSAMPR_DOMAIN_INFO_BUFFER DomainInformation
|
|
);
|
|
|
|
NTSTATUS
|
|
SamrCreateGroupInDomain(
|
|
[in] SAMPR_HANDLE DomainHandle,
|
|
[in] PRPC_UNICODE_STRING Name,
|
|
[in] ACCESS_MASK DesiredAccess,
|
|
[out] SAMPR_HANDLE * GroupHandle,
|
|
[out] PULONG RelativeId
|
|
);
|
|
|
|
|
|
NTSTATUS
|
|
SamrEnumerateGroupsInDomain(
|
|
[in] SAMPR_HANDLE DomainHandle,
|
|
[in,out] PSAM_ENUMERATE_HANDLE EnumerationContext,
|
|
[out] PSAMPR_ENUMERATION_BUFFER *Buffer,
|
|
[in] ULONG PreferedMaximumLength,
|
|
[out] PULONG CountReturned
|
|
);
|
|
|
|
NTSTATUS
|
|
SamrCreateUserInDomain(
|
|
[in] SAMPR_HANDLE DomainHandle,
|
|
[in] PRPC_UNICODE_STRING Name,
|
|
[in] ACCESS_MASK DesiredAccess,
|
|
[out] SAMPR_HANDLE * UserHandle,
|
|
[out] PULONG RelativeId
|
|
);
|
|
|
|
NTSTATUS
|
|
SamrEnumerateUsersInDomain(
|
|
[in] SAMPR_HANDLE DomainHandle,
|
|
[in,out] PSAM_ENUMERATE_HANDLE EnumerationContext,
|
|
[in] ULONG UserAccountControl,
|
|
[out] PSAMPR_ENUMERATION_BUFFER *Buffer,
|
|
[in] ULONG PreferedMaximumLength,
|
|
[out] PULONG CountReturned
|
|
);
|
|
|
|
NTSTATUS
|
|
SamrCreateAliasInDomain(
|
|
[in] SAMPR_HANDLE DomainHandle,
|
|
[in] PRPC_UNICODE_STRING AccountName,
|
|
[in] ACCESS_MASK DesiredAccess,
|
|
[out] SAMPR_HANDLE * AliasHandle,
|
|
[out] PULONG RelativeId
|
|
);
|
|
|
|
NTSTATUS
|
|
SamrEnumerateAliasesInDomain(
|
|
[in] SAMPR_HANDLE DomainHandle,
|
|
[in,out] PSAM_ENUMERATE_HANDLE EnumerationContext,
|
|
[out] PSAMPR_ENUMERATION_BUFFER *Buffer,
|
|
[in] ULONG PreferedMaximumLength,
|
|
[out] PULONG CountReturned
|
|
);
|
|
|
|
NTSTATUS
|
|
SamrGetAliasMembership(
|
|
[in] SAMPR_HANDLE DomainHandle,
|
|
[in] PSAMPR_PSID_ARRAY SidArray,
|
|
[out] PSAMPR_ULONG_ARRAY Membership
|
|
);
|
|
|
|
//
|
|
// The format of parameters in LookupNamesInDomain() differs between
|
|
// client and server side. This is accomplished using multiple .acf files.
|
|
// Please see samclient.acf and samsrvr.acf for further descriptions of
|
|
// parameter formats.
|
|
//
|
|
|
|
|
|
NTSTATUS
|
|
SamrLookupNamesInDomain(
|
|
[in] SAMPR_HANDLE DomainHandle,
|
|
[in] ULONG Count,
|
|
//
|
|
// The following count must match SAM_MAXIMUM_LOOKUP_COUNT,
|
|
// defined in ntsam.h
|
|
//
|
|
[in,size_is(1000), length_is(Count)]
|
|
RPC_UNICODE_STRING Names[*],
|
|
[out] PSAMPR_ULONG_ARRAY RelativeIds,
|
|
[out] PSAMPR_ULONG_ARRAY Use
|
|
);
|
|
|
|
//
|
|
//
|
|
// The format of parameters in LookupIdsInDomain() differs between
|
|
// client and server side. This is accomplished using multiple .acf files.
|
|
// Please see samclient.acf and samsrvr.acf for further descriptions of
|
|
// parameter formats.
|
|
//
|
|
|
|
NTSTATUS
|
|
SamrLookupIdsInDomain(
|
|
[in] SAMPR_HANDLE DomainHandle,
|
|
[in] ULONG Count,
|
|
//
|
|
// The following count must match SAM_MAXIMUM_LOOKUP_COUNT,
|
|
// defined in ntsam.h
|
|
//
|
|
[in,size_is(1000), length_is(Count)]
|
|
PULONG RelativeIds,
|
|
[out] PSAMPR_RETURNED_USTRING_ARRAY Names,
|
|
[out] PSAMPR_ULONG_ARRAY Use
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//
|
|
// Group related API
|
|
//
|
|
|
|
NTSTATUS
|
|
SamrOpenGroup(
|
|
[in] SAMPR_HANDLE DomainHandle,
|
|
[in] ACCESS_MASK DesiredAccess,
|
|
[in] ULONG GroupId,
|
|
[out] SAMPR_HANDLE * GroupHandle
|
|
);
|
|
|
|
NTSTATUS
|
|
SamrQueryInformationGroup(
|
|
[in] SAMPR_HANDLE GroupHandle,
|
|
[in] GROUP_INFORMATION_CLASS GroupInformationClass,
|
|
[out, switch_is(GroupInformationClass)]
|
|
PSAMPR_GROUP_INFO_BUFFER *Buffer
|
|
);
|
|
|
|
NTSTATUS
|
|
SamrSetInformationGroup(
|
|
[in] SAMPR_HANDLE GroupHandle,
|
|
[in] GROUP_INFORMATION_CLASS GroupInformationClass,
|
|
[in, switch_is(GroupInformationClass)]
|
|
PSAMPR_GROUP_INFO_BUFFER Buffer
|
|
);
|
|
|
|
NTSTATUS
|
|
SamrAddMemberToGroup(
|
|
[in] SAMPR_HANDLE GroupHandle,
|
|
[in] ULONG MemberId,
|
|
[in] ULONG Attributes
|
|
);
|
|
|
|
NTSTATUS
|
|
SamrDeleteGroup(
|
|
[in,out] SAMPR_HANDLE * GroupHandle
|
|
);
|
|
|
|
NTSTATUS
|
|
SamrRemoveMemberFromGroup(
|
|
[in] SAMPR_HANDLE GroupHandle,
|
|
[in] ULONG MemberId
|
|
);
|
|
|
|
NTSTATUS
|
|
SamrGetMembersInGroup(
|
|
[in] SAMPR_HANDLE GroupHandle,
|
|
[out] PSAMPR_GET_MEMBERS_BUFFER *Members
|
|
);
|
|
|
|
NTSTATUS
|
|
SamrSetMemberAttributesOfGroup(
|
|
[in] SAMPR_HANDLE GroupHandle,
|
|
[in] ULONG MemberId,
|
|
[in] ULONG Attributes
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//
|
|
// Alias related API
|
|
//
|
|
|
|
NTSTATUS
|
|
SamrOpenAlias(
|
|
[in] SAMPR_HANDLE DomainHandle,
|
|
[in] ACCESS_MASK DesiredAccess,
|
|
[in] ULONG AliasId,
|
|
[out] SAMPR_HANDLE * AliasHandle
|
|
);
|
|
|
|
NTSTATUS
|
|
SamrQueryInformationAlias(
|
|
[in] SAMPR_HANDLE AliasHandle,
|
|
[in] ALIAS_INFORMATION_CLASS AliasInformationClass,
|
|
[out, switch_is(AliasInformationClass)]
|
|
PSAMPR_ALIAS_INFO_BUFFER *Buffer
|
|
);
|
|
|
|
NTSTATUS
|
|
SamrSetInformationAlias(
|
|
[in] SAMPR_HANDLE AliasHandle,
|
|
[in] ALIAS_INFORMATION_CLASS AliasInformationClass,
|
|
[in, switch_is(AliasInformationClass)]
|
|
PSAMPR_ALIAS_INFO_BUFFER Buffer
|
|
);
|
|
|
|
NTSTATUS
|
|
SamrDeleteAlias(
|
|
[in, out] SAMPR_HANDLE * AliasHandle
|
|
);
|
|
|
|
NTSTATUS
|
|
SamrAddMemberToAlias(
|
|
[in] SAMPR_HANDLE AliasHandle,
|
|
[in] PRPC_SID MemberId
|
|
);
|
|
|
|
NTSTATUS
|
|
SamrRemoveMemberFromAlias(
|
|
[in] SAMPR_HANDLE AliasHandle,
|
|
[in] PRPC_SID MemberId
|
|
);
|
|
|
|
NTSTATUS
|
|
SamrGetMembersInAlias(
|
|
[in] SAMPR_HANDLE AliasHandle,
|
|
[out] PSAMPR_PSID_ARRAY Members
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//
|
|
// User related API
|
|
//
|
|
|
|
NTSTATUS
|
|
SamrOpenUser(
|
|
[in] SAMPR_HANDLE DomainHandle,
|
|
[in] ACCESS_MASK DesiredAccess,
|
|
[in] ULONG UserId,
|
|
[out] SAMPR_HANDLE * UserHandle
|
|
);
|
|
|
|
NTSTATUS
|
|
SamrDeleteUser(
|
|
[in,out] SAMPR_HANDLE * UserHandle
|
|
);
|
|
|
|
//
|
|
// Don't call the following api with an InfoClass level beyond
|
|
// UserAllInformation. This is the highest info level supported
|
|
// in NT1.0, and RPC didn't raise an exception when an invalid
|
|
// info level was passed, so the server side stub tries to unmarshal
|
|
// the [out] parameter (which isn't there) and can access violate.
|
|
//
|
|
// CALL SamrQueryInformationUser2() instead (see end of this file)
|
|
//
|
|
|
|
NTSTATUS
|
|
SamrQueryInformationUser(
|
|
[in] SAMPR_HANDLE UserHandle,
|
|
[in] USER_INFORMATION_CLASS UserInformationClass,
|
|
[out, switch_is(UserInformationClass)]
|
|
PSAMPR_USER_INFO_BUFFER *Buffer
|
|
);
|
|
|
|
NTSTATUS
|
|
SamrSetInformationUser(
|
|
[in] SAMPR_HANDLE UserHandle,
|
|
[in] USER_INFORMATION_CLASS UserInformationClass,
|
|
[in, switch_is(UserInformationClass)]
|
|
PSAMPR_USER_INFO_BUFFER Buffer
|
|
);
|
|
|
|
|
|
NTSTATUS
|
|
SamrChangePasswordUser(
|
|
[in] SAMPR_HANDLE UserHandle,
|
|
|
|
[in] BOOLEAN LmPresent,
|
|
[in, unique] PENCRYPTED_LM_OWF_PASSWORD LmOldEncryptedWithLmNew,
|
|
[in, unique] PENCRYPTED_LM_OWF_PASSWORD LmNewEncryptedWithLmOld,
|
|
|
|
[in] BOOLEAN NtPresent,
|
|
[in, unique] PENCRYPTED_NT_OWF_PASSWORD NtOldEncryptedWithNtNew,
|
|
[in, unique] PENCRYPTED_NT_OWF_PASSWORD NtNewEncryptedWithNtOld,
|
|
|
|
[in] BOOLEAN NtCrossEncryptionPresent,
|
|
[in, unique] PENCRYPTED_NT_OWF_PASSWORD NtNewEncryptedWithLmNew,
|
|
|
|
[in] BOOLEAN LmCrossEncryptionPresent,
|
|
[in, unique] PENCRYPTED_LM_OWF_PASSWORD LmNtNewEncryptedWithNtNew
|
|
);
|
|
|
|
NTSTATUS
|
|
SamrGetGroupsForUser(
|
|
[in] SAMPR_HANDLE UserHandle,
|
|
[out] PSAMPR_GET_GROUPS_BUFFER *Groups
|
|
);
|
|
|
|
//
|
|
// Don't call the following api with an InfoClass level beyond
|
|
// DomainDisplayMachine. This is the highest info level supported
|
|
// in NT1.0, and RPC didn't raise an exception when an invalid
|
|
// info level was passed, so the server side stub tries to unmarshal
|
|
// the [out] parameter (which isn't there) and can access violate.
|
|
//
|
|
// CALL SamrQueryDisplayInformation2() instead (see end of this file)
|
|
//
|
|
|
|
NTSTATUS
|
|
SamrQueryDisplayInformation (
|
|
[in] SAMPR_HANDLE DomainHandle,
|
|
[in] DOMAIN_DISPLAY_INFORMATION DisplayInformationClass,
|
|
[in] ULONG Index,
|
|
[in] ULONG EntryCount,
|
|
[in] ULONG PreferredMaximumLength,
|
|
[out] PULONG TotalAvailable,
|
|
[out] PULONG TotalReturned,
|
|
[out, switch_is(DisplayInformationClass)]
|
|
PSAMPR_DISPLAY_INFO_BUFFER Buffer
|
|
);
|
|
|
|
//
|
|
// Don't call the following api with an InfoClass level beyond
|
|
// DomainDisplayMachine. This is the highest info level supported
|
|
// in NT1.0, and RPC didn't raise an exception when an invalid
|
|
// info level was passed, so the server side stub tries to unmarshal
|
|
// the [out] parameter (which isn't there) and can access violate.
|
|
//
|
|
// CALL SamrGetDisplayEnumerationIndex2() instead (see end of this file)
|
|
//
|
|
|
|
NTSTATUS
|
|
SamrGetDisplayEnumerationIndex (
|
|
[in] SAMPR_HANDLE DomainHandle,
|
|
[in] DOMAIN_DISPLAY_INFORMATION DisplayInformationClass,
|
|
[in] PRPC_UNICODE_STRING Prefix,
|
|
[out] PULONG Index
|
|
);
|
|
|
|
|
|
//
|
|
// Test APIs.
|
|
// These only do anything on special builds.
|
|
//
|
|
|
|
NTSTATUS
|
|
SamrTestPrivateFunctionsDomain (
|
|
[in] SAMPR_HANDLE DomainHandle
|
|
);
|
|
|
|
NTSTATUS
|
|
SamrTestPrivateFunctionsUser (
|
|
[in] SAMPR_HANDLE UserHandle
|
|
);
|
|
|
|
|
|
//
|
|
// The following is only for use by WRAPPERS.C, although there's no
|
|
// harm done if an application calls it.
|
|
//
|
|
|
|
NTSTATUS
|
|
SamrGetUserDomainPasswordInformation (
|
|
[in] SAMPR_HANDLE UserHandle,
|
|
[out] PUSER_DOMAIN_PASSWORD_INFORMATION PasswordInformation
|
|
);
|
|
|
|
//
|
|
// API added late, so we want it at the end.
|
|
//
|
|
|
|
NTSTATUS
|
|
SamrRemoveMemberFromForeignDomain (
|
|
[in] SAMPR_HANDLE DomainHandle,
|
|
[in] PRPC_SID MemberSid
|
|
);
|
|
|
|
//
|
|
// API added for NT1.0A.
|
|
// These must be added at the end of the file to ensure operability
|
|
// with down-level systems. That is, the API number of all existing
|
|
// API must be kept the same as it was.
|
|
//
|
|
|
|
NTSTATUS
|
|
SamrQueryInformationDomain2( // Added for NT1.0A
|
|
[in] SAMPR_HANDLE DomainHandle,
|
|
[in] DOMAIN_INFORMATION_CLASS DomainInformationClass,
|
|
[out, switch_is(DomainInformationClass)]
|
|
PSAMPR_DOMAIN_INFO_BUFFER *Buffer
|
|
);
|
|
|
|
NTSTATUS
|
|
SamrQueryInformationUser2(
|
|
[in] SAMPR_HANDLE UserHandle,
|
|
[in] USER_INFORMATION_CLASS UserInformationClass,
|
|
[out, switch_is(UserInformationClass)]
|
|
PSAMPR_USER_INFO_BUFFER *Buffer
|
|
);
|
|
|
|
NTSTATUS
|
|
SamrQueryDisplayInformation2 (
|
|
[in] SAMPR_HANDLE DomainHandle,
|
|
[in] DOMAIN_DISPLAY_INFORMATION DisplayInformationClass,
|
|
[in] ULONG Index,
|
|
[in] ULONG EntryCount,
|
|
[in] ULONG PreferredMaximumLength,
|
|
[out] PULONG TotalAvailable,
|
|
[out] PULONG TotalReturned,
|
|
[out, switch_is(DisplayInformationClass)]
|
|
PSAMPR_DISPLAY_INFO_BUFFER Buffer
|
|
);
|
|
|
|
NTSTATUS
|
|
SamrGetDisplayEnumerationIndex2 (
|
|
[in] SAMPR_HANDLE DomainHandle,
|
|
[in] DOMAIN_DISPLAY_INFORMATION DisplayInformationClass,
|
|
[in] PRPC_UNICODE_STRING Prefix,
|
|
[out] PULONG Index
|
|
);
|
|
|
|
|
|
NTSTATUS
|
|
SamrCreateUser2InDomain(
|
|
[in] SAMPR_HANDLE DomainHandle,
|
|
[in] PRPC_UNICODE_STRING Name,
|
|
[in] ULONG AccountType,
|
|
[in] ACCESS_MASK DesiredAccess,
|
|
[out] SAMPR_HANDLE * UserHandle,
|
|
[out] PULONG GrantedAccess,
|
|
[out] PULONG RelativeId
|
|
);
|
|
|
|
NTSTATUS
|
|
SamrQueryDisplayInformation3 (
|
|
[in] SAMPR_HANDLE DomainHandle,
|
|
[in] DOMAIN_DISPLAY_INFORMATION DisplayInformationClass,
|
|
[in] ULONG Index,
|
|
[in] ULONG EntryCount,
|
|
[in] ULONG PreferredMaximumLength,
|
|
[out] PULONG TotalAvailable,
|
|
[out] PULONG TotalReturned,
|
|
[out, switch_is(DisplayInformationClass)]
|
|
PSAMPR_DISPLAY_INFO_BUFFER Buffer
|
|
);
|
|
|
|
NTSTATUS
|
|
SamrAddMultipleMembersToAlias(
|
|
[in] SAMPR_HANDLE AliasHandle,
|
|
[in] PSAMPR_PSID_ARRAY MembersBuffer
|
|
);
|
|
|
|
NTSTATUS
|
|
SamrRemoveMultipleMembersFromAlias(
|
|
[in] SAMPR_HANDLE AliasHandle,
|
|
[in] PSAMPR_PSID_ARRAY MembersBuffer
|
|
);
|
|
|
|
|
|
NTSTATUS
|
|
SamrOemChangePasswordUser2(
|
|
[in] handle_t BindingHandle,
|
|
[in,unique] PRPC_STRING ServerName,
|
|
[in] PRPC_STRING UserName,
|
|
[in,unique] PSAMPR_ENCRYPTED_USER_PASSWORD NewPasswordEncryptedWithOldLm,
|
|
[in,unique] PENCRYPTED_LM_OWF_PASSWORD OldLmOwfPassswordEncryptedWithNewLm
|
|
);
|
|
|
|
NTSTATUS
|
|
SamrUnicodeChangePasswordUser2(
|
|
[in] handle_t BindingHandle,
|
|
[in,unique] PRPC_UNICODE_STRING ServerName,
|
|
[in] PRPC_UNICODE_STRING UserName,
|
|
[in,unique] PSAMPR_ENCRYPTED_USER_PASSWORD NewPasswordEncryptedWithOldNt,
|
|
[in,unique] PENCRYPTED_NT_OWF_PASSWORD OldNtOwfPasswordEncryptedWithNewNt,
|
|
[in] BOOLEAN LmPresent,
|
|
[in,unique] PSAMPR_ENCRYPTED_USER_PASSWORD NewPasswordEncryptedWithOldLm,
|
|
[in,unique] PENCRYPTED_LM_OWF_PASSWORD OldLmOwfPassswordEncryptedWithNewLmOrNt
|
|
);
|
|
|
|
NTSTATUS
|
|
SamrGetDomainPasswordInformation (
|
|
[in] handle_t BindingHandle,
|
|
[in,unique] PRPC_UNICODE_STRING ServerName,
|
|
[out] PUSER_DOMAIN_PASSWORD_INFORMATION PasswordInformation
|
|
);
|
|
|
|
NTSTATUS
|
|
SamrConnect2(
|
|
[in,unique,string] PSAMPR_SERVER_NAME ServerName,
|
|
[out] SAMPR_HANDLE * ServerHandle,
|
|
[in] ACCESS_MASK DesiredAccess
|
|
);
|
|
|
|
|
|
NTSTATUS
|
|
SamrSetInformationUser2(
|
|
[in] SAMPR_HANDLE UserHandle,
|
|
[in] USER_INFORMATION_CLASS UserInformationClass,
|
|
[in, switch_is(UserInformationClass)]
|
|
PSAMPR_USER_INFO_BUFFER Buffer
|
|
);
|
|
|
|
}
|
|
|
|
|