+
+ /* Initialize the Server name*/
+ if (servername != NULL)
+ RtlInitUnicodeString(&ServerName, servername);
+
+ /* Initialize the Alias name*/
+ switch (level)
+ {
+ case 0:
+ aliasname = ((PLOCALGROUP_INFO_0)buf)->lgrpi0_name;
+ aliascomment = NULL;
+ break;
+
+ case 1:
+ aliasname = ((PLOCALGROUP_INFO_1)buf)->lgrpi1_name;
+ aliascomment = ((PLOCALGROUP_INFO_1)buf)->lgrpi1_comment;
+ break;
+
+ default:
+ return ERROR_INVALID_LEVEL;
+ }
+
+ RtlInitUnicodeString(&AliasName, aliasname);
+
+ /* Connect to the SAM Server */
+ Status = SamConnect((servername != NULL) ? &ServerName : NULL,
+ &ServerHandle,
+ SAM_SERVER_CONNECT | SAM_SERVER_LOOKUP_DOMAIN,
+ NULL);
+ if (!NT_SUCCESS(Status))
+ {
+ ERR("SamConnect failed (Status %08lx)\n", Status);
+ ApiStatus = NetpNtStatusToApiStatus(Status);
+ goto done;
+ }
+
+ /* Get the Builtin Domain SID */
+ Status = GetBuiltinDomainSid(&DomainSid);
+ if (!NT_SUCCESS(Status))
+ {
+ ERR("GetBuiltinDomainSid failed (Status %08lx)\n", Status);
+ ApiStatus = NetpNtStatusToApiStatus(Status);
+ goto done;
+ }
+
+ /* Open the Builtin Domain */
+ Status = SamOpenDomain(ServerHandle,
+ DOMAIN_LOOKUP,
+ DomainSid,
+ &DomainHandle);
+ if (!NT_SUCCESS(Status))
+ {
+ ERR("SamOpenDomain failed (Status %08lx)\n", Status);
+ ApiStatus = NetpNtStatusToApiStatus(Status);
+ goto done;
+ }
+
+ /* Try to open the Alias Account in the Builtin Domain */
+ ApiStatus = OpenAliasByName(DomainHandle,
+ &AliasName,
+ ALIAS_READ_INFORMATION,
+ &AliasHandle);
+ if (ApiStatus == NERR_Success)
+ {
+ ERR("OpenAliasByName: alias %wZ already exists!\n", &AliasName);
+
+ SamCloseHandle(AliasHandle);
+ ApiStatus = ERROR_ALIAS_EXISTS;
+ goto done;
+ }
+
+ ApiStatus = NERR_Success;
+
+ /* Free the Builtin Domain SID */
+ RtlFreeHeap(RtlGetProcessHeap(), 0, DomainSid);
+ DomainSid = NULL;
+
+ /* Close the Builtin Domain */
+ SamCloseHandle(DomainHandle);
+ DomainHandle = NULL;
+
+ /* Get the account domain SID */
+ Status = GetAccountDomainSid((servername != NULL) ? &ServerName : NULL,
+ &DomainSid);
+ if (!NT_SUCCESS(Status))
+ {
+ ERR("GetAccountDomainSid failed (Status %08lx)\n", Status);
+ ApiStatus = NetpNtStatusToApiStatus(Status);
+ goto done;
+ }
+
+ /* Open the account domain */
+ Status = SamOpenDomain(ServerHandle,
+ DOMAIN_CREATE_ALIAS | DOMAIN_LOOKUP,
+ DomainSid,
+ &DomainHandle);
+ if (!NT_SUCCESS(Status))
+ {
+ ERR("SamOpenDomain failed (Status %08lx)\n", Status);
+ ApiStatus = NetpNtStatusToApiStatus(Status);
+ goto done;
+ }
+
+ /* Create the alias */
+ Status = SamCreateAliasInDomain(DomainHandle,
+ &AliasName,
+ DELETE | ALIAS_WRITE_ACCOUNT,
+ &AliasHandle,
+ &RelativeId);
+ if (!NT_SUCCESS(Status))
+ {
+ ERR("SamCreateAliasInDomain failed (Status %08lx)\n", Status);
+ ApiStatus = NetpNtStatusToApiStatus(Status);
+ goto done;
+ }
+
+ TRACE("Created alias \"%wZ\" (RID: %lu)\n", &AliasName, RelativeId);
+
+ /* Set the admin comment */
+ if (level == 1)
+ {
+ RtlInitUnicodeString(&AdminComment.AdminComment, aliascomment);
+
+ Status = SamSetInformationAlias(AliasHandle,
+ AliasAdminCommentInformation,
+ &AdminComment);
+ if (!NT_SUCCESS(Status))
+ {
+ ERR("SamSetInformationAlias failed (Status %08lx)\n", Status);
+ ApiStatus = NetpNtStatusToApiStatus(Status);
+
+ /* Delete the Alias if the Comment could not be set */
+ SamDeleteAlias(AliasHandle);
+
+ goto done;
+ }
+ }
+
+done:
+ if (AliasHandle != NULL)
+ SamCloseHandle(AliasHandle);
+
+ if (DomainSid != NULL)
+ RtlFreeHeap(RtlGetProcessHeap(), 0, DomainSid);
+
+ if (DomainHandle != NULL)
+ SamCloseHandle(DomainHandle);
+
+ if (ServerHandle != NULL)
+ SamCloseHandle(ServerHandle);
+
+ return ApiStatus;