}
+NTSTATUS
+NTAPI
+SamCreateGroupInDomain(IN SAM_HANDLE DomainHandle,
+ IN PUNICODE_STRING AccountName,
+ IN ACCESS_MASK DesiredAccess,
+ OUT PSAM_HANDLE GroupHandle,
+ OUT PULONG RelativeId)
+{
+ NTSTATUS Status;
+
+ TRACE("SamCreateGroupInDomain(%p,%p,0x%08x,%p,%p)\n",
+ DomainHandle, AccountName, DesiredAccess, GroupHandle, RelativeId);
+
+ RpcTryExcept
+ {
+ Status = SamrCreateGroupInDomain((SAMPR_HANDLE)DomainHandle,
+ (PRPC_UNICODE_STRING)AccountName,
+ DesiredAccess,
+ (SAMPR_HANDLE *)GroupHandle,
+ RelativeId);
+ }
+ RpcExcept(EXCEPTION_EXECUTE_HANDLER)
+ {
+ Status = I_RpcMapWin32Status(RpcExceptionCode());
+ }
+ RpcEndExcept;
+
+ return Status;
+}
+
+
NTSTATUS
NTAPI
SamCreateUserInDomain(IN SAM_HANDLE DomainHandle,
}
+NTSTATUS
+NTAPI
+SamOpenGroup(IN SAM_HANDLE DomainHandle,
+ IN ACCESS_MASK DesiredAccess,
+ IN ULONG GroupId,
+ OUT PSAM_HANDLE GroupHandle)
+{
+ NTSTATUS Status;
+
+ TRACE("SamOpenGroup(%p,0x%08x,%p,%p)\n",
+ DomainHandle, DesiredAccess, GroupId, GroupHandle);
+
+ RpcTryExcept
+ {
+ Status = SamrOpenGroup((SAMPR_HANDLE)DomainHandle,
+ DesiredAccess,
+ GroupId,
+ (SAMPR_HANDLE *)GroupHandle);
+ }
+ RpcExcept(EXCEPTION_EXECUTE_HANDLER)
+ {
+ Status = I_RpcMapWin32Status(RpcExceptionCode());
+ }
+ RpcEndExcept;
+
+ return Status;
+}
+
+
NTSTATUS
NTAPI
SamOpenUser(IN SAM_HANDLE DomainHandle,
OUT SAMPR_HANDLE *GroupHandle,
OUT unsigned long *RelativeId)
{
- UNIMPLEMENTED;
- return STATUS_NOT_IMPLEMENTED;
+ UNICODE_STRING EmptyString = RTL_CONSTANT_STRING(L"");
+ SAM_DOMAIN_FIXED_DATA FixedDomainData;
+ SAM_GROUP_FIXED_DATA FixedGroupData;
+ PSAM_DB_OBJECT DomainObject;
+ PSAM_DB_OBJECT GroupObject;
+ ULONG ulSize;
+ ULONG ulRid;
+ WCHAR szRid[9];
+ NTSTATUS Status;
+
+ TRACE("SamrCreateGroupInDomain(%p %p %lx %p %p)\n",
+ DomainHandle, Name, DesiredAccess, GroupHandle, RelativeId);
+
+ /* Validate the domain handle */
+ Status = SampValidateDbObject(DomainHandle,
+ SamDbDomainObject,
+ DOMAIN_CREATE_GROUP,
+ &DomainObject);
+ if (!NT_SUCCESS(Status))
+ {
+ TRACE("failed with status 0x%08lx\n", Status);
+ return Status;
+ }
+
+ /* Get the fixed domain attributes */
+ ulSize = sizeof(SAM_DOMAIN_FIXED_DATA);
+ Status = SampGetObjectAttribute(DomainObject,
+ L"F",
+ NULL,
+ (PVOID)&FixedDomainData,
+ &ulSize);
+ if (!NT_SUCCESS(Status))
+ {
+ TRACE("failed with status 0x%08lx\n", Status);
+ return Status;
+ }
+
+ /* Increment the NextRid attribute */
+ ulRid = FixedDomainData.NextRid;
+ FixedDomainData.NextRid++;
+
+ /* Store the fixed domain attributes */
+ Status = SampSetObjectAttribute(DomainObject,
+ L"F",
+ REG_BINARY,
+ &FixedDomainData,
+ ulSize);
+ if (!NT_SUCCESS(Status))
+ {
+ TRACE("failed with status 0x%08lx\n", Status);
+ return Status;
+ }
+
+ TRACE("RID: %lx\n", ulRid);
+
+ /* Convert the RID into a string (hex) */
+ swprintf(szRid, L"%08lX", ulRid);
+
+ /* FIXME: Check whether the group name is already in use */
+
+ /* Create the group object */
+ Status = SampCreateDbObject(DomainObject,
+ L"Groups",
+ szRid,
+ SamDbGroupObject,
+ DesiredAccess,
+ &GroupObject);
+ if (!NT_SUCCESS(Status))
+ {
+ TRACE("failed with status 0x%08lx\n", Status);
+ return Status;
+ }
+
+ /* Add the name alias for the user object */
+ Status = SampSetDbObjectNameAlias(DomainObject,
+ L"Groups",
+ Name->Buffer,
+ ulRid);
+ if (!NT_SUCCESS(Status))
+ {
+ TRACE("failed with status 0x%08lx\n", Status);
+ return Status;
+ }
+
+ /* Initialize fixed user data */
+ memset(&FixedGroupData, 0, sizeof(SAM_GROUP_FIXED_DATA));
+ FixedGroupData.Version = 1;
+
+ FixedGroupData.GroupId = ulRid;
+
+ /* Set fixed user data attribute */
+ Status = SampSetObjectAttribute(GroupObject,
+ L"F",
+ REG_BINARY,
+ (LPVOID)&FixedGroupData,
+ sizeof(SAM_GROUP_FIXED_DATA));
+ if (!NT_SUCCESS(Status))
+ {
+ TRACE("failed with status 0x%08lx\n", Status);
+ return Status;
+ }
+
+ /* Set the Name attribute */
+ Status = SampSetObjectAttribute(GroupObject,
+ L"Name",
+ REG_SZ,
+ (LPVOID)Name->Buffer,
+ Name->MaximumLength);
+ if (!NT_SUCCESS(Status))
+ {
+ TRACE("failed with status 0x%08lx\n", Status);
+ return Status;
+ }
+
+ /* Set the AdminComment attribute */
+ Status = SampSetObjectAttribute(GroupObject,
+ L"AdminComment",
+ REG_SZ,
+ EmptyString.Buffer,
+ EmptyString.MaximumLength);
+ if (!NT_SUCCESS(Status))
+ {
+ TRACE("failed with status 0x%08lx\n", Status);
+ return Status;
+ }
+
+ if (NT_SUCCESS(Status))
+ {
+ *GroupHandle = (SAMPR_HANDLE)GroupObject;
+ *RelativeId = ulRid;
+ }
+
+ TRACE("returns with status 0x%08lx\n", Status);
+
+ return Status;
}
-/* Function 10 */
+
+/* Function 11 */
NTSTATUS
NTAPI
SamrEnumerateGroupsInDomain(IN SAMPR_HANDLE DomainHandle,
return STATUS_NOT_IMPLEMENTED;
}
+
/* Function 12 */
NTSTATUS
NTAPI
OUT SAMPR_HANDLE *UserHandle,
OUT unsigned long *RelativeId)
{
+ UNICODE_STRING EmptyString = RTL_CONSTANT_STRING(L"");
SAM_DOMAIN_FIXED_DATA FixedDomainData;
SAM_USER_FIXED_DATA FixedUserData;
PSAM_DB_OBJECT DomainObject;
return Status;
}
- /* Set the name attribute */
+ /* Set the Name attribute */
Status = SampSetObjectAttribute(UserObject,
L"Name",
REG_SZ,
return Status;
}
+ /* Set the FullName attribute */
+ Status = SampSetObjectAttribute(UserObject,
+ L"FullName",
+ REG_SZ,
+ EmptyString.Buffer,
+ EmptyString.MaximumLength);
+ if (!NT_SUCCESS(Status))
+ {
+ TRACE("failed with status 0x%08lx\n", Status);
+ return Status;
+ }
+
+ /* Set the HomeDirectory attribute */
+ Status = SampSetObjectAttribute(UserObject,
+ L"HomeDirectory",
+ REG_SZ,
+ EmptyString.Buffer,
+ EmptyString.MaximumLength);
+ if (!NT_SUCCESS(Status))
+ {
+ TRACE("failed with status 0x%08lx\n", Status);
+ return Status;
+ }
+
+ /* Set the HomeDirectoryDrive attribute */
+ Status = SampSetObjectAttribute(UserObject,
+ L"HomeDirectoryDrive",
+ REG_SZ,
+ EmptyString.Buffer,
+ EmptyString.MaximumLength);
+ if (!NT_SUCCESS(Status))
+ {
+ TRACE("failed with status 0x%08lx\n", Status);
+ return Status;
+ }
+
+ /* Set the ScriptPath attribute */
+ Status = SampSetObjectAttribute(UserObject,
+ L"ScriptPath",
+ REG_SZ,
+ EmptyString.Buffer,
+ EmptyString.MaximumLength);
+ if (!NT_SUCCESS(Status))
+ {
+ TRACE("failed with status 0x%08lx\n", Status);
+ return Status;
+ }
+
+ /* Set the ProfilePath attribute */
+ Status = SampSetObjectAttribute(UserObject,
+ L"ProfilePath",
+ REG_SZ,
+ EmptyString.Buffer,
+ EmptyString.MaximumLength);
+ if (!NT_SUCCESS(Status))
+ {
+ TRACE("failed with status 0x%08lx\n", Status);
+ return Status;
+ }
+
+ /* Set the AdminComment attribute */
+ Status = SampSetObjectAttribute(UserObject,
+ L"AdminComment",
+ REG_SZ,
+ EmptyString.Buffer,
+ EmptyString.MaximumLength);
+ if (!NT_SUCCESS(Status))
+ {
+ TRACE("failed with status 0x%08lx\n", Status);
+ return Status;
+ }
+
+ /* Set the UserComment attribute */
+ Status = SampSetObjectAttribute(UserObject,
+ L"UserComment",
+ REG_SZ,
+ EmptyString.Buffer,
+ EmptyString.MaximumLength);
+ if (!NT_SUCCESS(Status))
+ {
+ TRACE("failed with status 0x%08lx\n", Status);
+ return Status;
+ }
+
+ /* Set the WorkStations attribute */
+ Status = SampSetObjectAttribute(UserObject,
+ L"WorkStations",
+ REG_SZ,
+ EmptyString.Buffer,
+ EmptyString.MaximumLength);
+ if (!NT_SUCCESS(Status))
+ {
+ TRACE("failed with status 0x%08lx\n", Status);
+ return Status;
+ }
+
/* FIXME: Set default user attributes */
if (NT_SUCCESS(Status))
return Status;
}
+
/* Function 13 */
NTSTATUS
NTAPI
return STATUS_NOT_IMPLEMENTED;
}
+
/* Function 14 */
NTSTATUS
NTAPI
return STATUS_ALIAS_EXISTS;
}
- /* Create the user object */
+ /* Create the alias object */
Status = SampCreateDbObject(DomainObject,
L"Aliases",
szRid,
return Status;
}
+
/* Function 17 */
NTSTATUS
NTAPI
return STATUS_NOT_IMPLEMENTED;
}
+
/* Function 19 */
NTSTATUS
NTAPI
IN unsigned long GroupId,
OUT SAMPR_HANDLE *GroupHandle)
{
- UNIMPLEMENTED;
- return STATUS_NOT_IMPLEMENTED;
+ PSAM_DB_OBJECT DomainObject;
+ PSAM_DB_OBJECT GroupObject;
+ WCHAR szRid[9];
+ NTSTATUS Status;
+
+ TRACE("SamrOpenGroup(%p %lx %lx %p)\n",
+ DomainHandle, DesiredAccess, GroupId, GroupHandle);
+
+ /* Validate the domain handle */
+ Status = SampValidateDbObject(DomainHandle,
+ SamDbDomainObject,
+ DOMAIN_LOOKUP,
+ &DomainObject);
+ if (!NT_SUCCESS(Status))
+ {
+ TRACE("failed with status 0x%08lx\n", Status);
+ return Status;
+ }
+
+ /* Convert the RID into a string (hex) */
+ swprintf(szRid, L"%08lX", GroupId);
+
+ /* Create the group object */
+ Status = SampOpenDbObject(DomainObject,
+ L"Groups",
+ szRid,
+ SamDbGroupObject,
+ DesiredAccess,
+ &GroupObject);
+ if (!NT_SUCCESS(Status))
+ {
+ TRACE("failed with status 0x%08lx\n", Status);
+ return Status;
+ }
+
+ *GroupHandle = (SAMPR_HANDLE)GroupObject;
+
+ return STATUS_SUCCESS;
}
+
/* Function 20 */
NTSTATUS
NTAPI
TRACE("SamrAddMemberToAlias(%p %p)\n",
AliasHandle, MemberId);
- /* Validate the domain handle */
+ /* Validate the alias handle */
Status = SampValidateDbObject(AliasHandle,
SamDbAliasObject,
ALIAS_ADD_MEMBER,