Store an objects relative id in the database object. This will later be used to protect pre-defined objects from being deleted.

svn path=/trunk/; revision=58038
This commit is contained in:
Eric Kohl 2012-12-29 14:44:42 +00:00
parent dfa3ce1995
commit e002133064
3 changed files with 17 additions and 0 deletions

View file

@ -97,6 +97,7 @@ NTSTATUS
SampCreateDbObject(IN PSAM_DB_OBJECT ParentObject, SampCreateDbObject(IN PSAM_DB_OBJECT ParentObject,
IN LPWSTR ContainerName, IN LPWSTR ContainerName,
IN LPWSTR ObjectName, IN LPWSTR ObjectName,
IN ULONG RelativeId,
IN SAM_DB_OBJECT_TYPE ObjectType, IN SAM_DB_OBJECT_TYPE ObjectType,
IN ACCESS_MASK DesiredAccess, IN ACCESS_MASK DesiredAccess,
OUT PSAM_DB_OBJECT *DbObject) OUT PSAM_DB_OBJECT *DbObject)
@ -240,6 +241,7 @@ SampCreateDbObject(IN PSAM_DB_OBJECT ParentObject,
NewObject->Access = DesiredAccess; NewObject->Access = DesiredAccess;
NewObject->KeyHandle = ObjectKeyHandle; NewObject->KeyHandle = ObjectKeyHandle;
NewObject->MembersKeyHandle = MembersKeyHandle; NewObject->MembersKeyHandle = MembersKeyHandle;
NewObject->RelativeId = RelativeId;
NewObject->ParentObject = ParentObject; NewObject->ParentObject = ParentObject;
if (ParentObject != NULL) if (ParentObject != NULL)
@ -255,6 +257,7 @@ NTSTATUS
SampOpenDbObject(IN PSAM_DB_OBJECT ParentObject, SampOpenDbObject(IN PSAM_DB_OBJECT ParentObject,
IN LPWSTR ContainerName, IN LPWSTR ContainerName,
IN LPWSTR ObjectName, IN LPWSTR ObjectName,
IN ULONG RelativeId,
IN SAM_DB_OBJECT_TYPE ObjectType, IN SAM_DB_OBJECT_TYPE ObjectType,
IN ACCESS_MASK DesiredAccess, IN ACCESS_MASK DesiredAccess,
OUT PSAM_DB_OBJECT *DbObject) OUT PSAM_DB_OBJECT *DbObject)
@ -390,6 +393,7 @@ SampOpenDbObject(IN PSAM_DB_OBJECT ParentObject,
NewObject->Access = DesiredAccess; NewObject->Access = DesiredAccess;
NewObject->KeyHandle = ObjectKeyHandle; NewObject->KeyHandle = ObjectKeyHandle;
NewObject->MembersKeyHandle = MembersKeyHandle; NewObject->MembersKeyHandle = MembersKeyHandle;
NewObject->RelativeId = RelativeId;
NewObject->ParentObject = ParentObject; NewObject->ParentObject = ParentObject;
if (ParentObject != NULL) if (ParentObject != NULL)

View file

@ -88,6 +88,7 @@ SamrConnect(IN PSAMPR_SERVER_NAME ServerName,
Status = SampOpenDbObject(NULL, Status = SampOpenDbObject(NULL,
NULL, NULL,
L"SAM", L"SAM",
0,
SamDbServerObject, SamDbServerObject,
DesiredAccess, DesiredAccess,
&ServerObject); &ServerObject);
@ -509,6 +510,7 @@ SamrOpenDomain(IN SAMPR_HANDLE ServerHandle,
Status = SampOpenDbObject(ServerObject, Status = SampOpenDbObject(ServerObject,
L"Domains", L"Domains",
L"Builtin", L"Builtin",
0,
SamDbDomainObject, SamDbDomainObject,
DesiredAccess, DesiredAccess,
&DomainObject); &DomainObject);
@ -524,6 +526,7 @@ SamrOpenDomain(IN SAMPR_HANDLE ServerHandle,
Status = SampOpenDbObject(ServerObject, Status = SampOpenDbObject(ServerObject,
L"Domains", L"Domains",
L"Account", L"Account",
0,
SamDbDomainObject, SamDbDomainObject,
DesiredAccess, DesiredAccess,
&DomainObject); &DomainObject);
@ -1709,6 +1712,7 @@ SamrCreateGroupInDomain(IN SAMPR_HANDLE DomainHandle,
Status = SampCreateDbObject(DomainObject, Status = SampCreateDbObject(DomainObject,
L"Groups", L"Groups",
szRid, szRid,
ulRid,
SamDbGroupObject, SamDbGroupObject,
DesiredAccess, DesiredAccess,
&GroupObject); &GroupObject);
@ -2074,6 +2078,7 @@ SamrCreateUserInDomain(IN SAMPR_HANDLE DomainHandle,
Status = SampCreateDbObject(DomainObject, Status = SampCreateDbObject(DomainObject,
L"Users", L"Users",
szRid, szRid,
ulRid,
SamDbUserObject, SamDbUserObject,
DesiredAccess, DesiredAccess,
&UserObject); &UserObject);
@ -2527,6 +2532,7 @@ SamrCreateAliasInDomain(IN SAMPR_HANDLE DomainHandle,
Status = SampCreateDbObject(DomainObject, Status = SampCreateDbObject(DomainObject,
L"Aliases", L"Aliases",
szRid, szRid,
ulRid,
SamDbAliasObject, SamDbAliasObject,
DesiredAccess, DesiredAccess,
&AliasObject); &AliasObject);
@ -3464,6 +3470,7 @@ SamrOpenGroup(IN SAMPR_HANDLE DomainHandle,
Status = SampOpenDbObject(DomainObject, Status = SampOpenDbObject(DomainObject,
L"Groups", L"Groups",
szRid, szRid,
GroupId,
SamDbGroupObject, SamDbGroupObject,
DesiredAccess, DesiredAccess,
&GroupObject); &GroupObject);
@ -3911,6 +3918,7 @@ SamrOpenAlias(IN SAMPR_HANDLE DomainHandle,
Status = SampOpenDbObject(DomainObject, Status = SampOpenDbObject(DomainObject,
L"Aliases", L"Aliases",
szRid, szRid,
AliasId,
SamDbAliasObject, SamDbAliasObject,
DesiredAccess, DesiredAccess,
&AliasObject); &AliasObject);
@ -4575,6 +4583,7 @@ SamrOpenUser(IN SAMPR_HANDLE DomainHandle,
Status = SampOpenDbObject(DomainObject, Status = SampOpenDbObject(DomainObject,
L"Users", L"Users",
szRid, szRid,
UserId,
SamDbUserObject, SamDbUserObject,
DesiredAccess, DesiredAccess,
&UserObject); &UserObject);
@ -6335,6 +6344,7 @@ SamrCreateUser2InDomain(IN SAMPR_HANDLE DomainHandle,
Status = SampCreateDbObject(DomainObject, Status = SampCreateDbObject(DomainObject,
L"Users", L"Users",
szRid, szRid,
ulRid,
SamDbUserObject, SamDbUserObject,
DesiredAccess, DesiredAccess,
&UserObject); &UserObject);

View file

@ -46,6 +46,7 @@ typedef struct _SAM_DB_OBJECT
LPWSTR Name; LPWSTR Name;
HANDLE KeyHandle; HANDLE KeyHandle;
HANDLE MembersKeyHandle; // only used by Aliases and Groups HANDLE MembersKeyHandle; // only used by Aliases and Groups
ULONG RelativeId;
struct _SAM_DB_OBJECT *ParentObject; struct _SAM_DB_OBJECT *ParentObject;
} SAM_DB_OBJECT, *PSAM_DB_OBJECT; } SAM_DB_OBJECT, *PSAM_DB_OBJECT;
@ -117,6 +118,7 @@ NTSTATUS
SampCreateDbObject(IN PSAM_DB_OBJECT ParentObject, SampCreateDbObject(IN PSAM_DB_OBJECT ParentObject,
IN LPWSTR ContainerName, IN LPWSTR ContainerName,
IN LPWSTR ObjectName, IN LPWSTR ObjectName,
IN ULONG RelativeId,
IN SAM_DB_OBJECT_TYPE ObjectType, IN SAM_DB_OBJECT_TYPE ObjectType,
IN ACCESS_MASK DesiredAccess, IN ACCESS_MASK DesiredAccess,
OUT PSAM_DB_OBJECT *DbObject); OUT PSAM_DB_OBJECT *DbObject);
@ -125,6 +127,7 @@ NTSTATUS
SampOpenDbObject(IN PSAM_DB_OBJECT ParentObject, SampOpenDbObject(IN PSAM_DB_OBJECT ParentObject,
IN LPWSTR ContainerName, IN LPWSTR ContainerName,
IN LPWSTR ObjectName, IN LPWSTR ObjectName,
IN ULONG RelativeId,
IN SAM_DB_OBJECT_TYPE ObjectType, IN SAM_DB_OBJECT_TYPE ObjectType,
IN ACCESS_MASK DesiredAccess, IN ACCESS_MASK DesiredAccess,
OUT PSAM_DB_OBJECT *DbObject); OUT PSAM_DB_OBJECT *DbObject);