#include "netapi32.h"
-WINE_DEFAULT_DEBUG_CHANNEL(netapi32);
+#include <ndk/kefuncs.h>
+#include <ndk/obfuncs.h>
+WINE_DEFAULT_DEBUG_CHANNEL(netapi32);
typedef struct _ENUM_CONTEXT
{
}
+static
+NTSTATUS
+GetAllowedWorldAce(IN PACL Acl,
+ OUT PACCESS_ALLOWED_ACE *Ace)
+{
+ SID_IDENTIFIER_AUTHORITY WorldAuthority = {SECURITY_WORLD_SID_AUTHORITY};
+ ULONG WorldSid[sizeof(SID) / sizeof(ULONG) + SID_MAX_SUB_AUTHORITIES];
+ ACL_SIZE_INFORMATION AclSize;
+ PVOID LocalAce = NULL;
+ ULONG i;
+ NTSTATUS Status;
+
+ *Ace = NULL;
+
+ RtlInitializeSid((PSID)WorldSid,
+ &WorldAuthority,
+ 1);
+ *(RtlSubAuthoritySid((PSID)WorldSid, 0)) = SECURITY_WORLD_RID;
+
+ Status = RtlQueryInformationAcl(Acl,
+ &AclSize,
+ sizeof(AclSize),
+ AclSizeInformation);
+ if (!NT_SUCCESS(Status))
+ return Status;
+
+ for (i = 0; i < AclSize.AceCount; i++)
+ {
+ Status = RtlGetAce(Acl, i, &LocalAce);
+ if (!NT_SUCCESS(Status))
+ return Status;
+
+ if (((PACE_HEADER)LocalAce)->AceType != ACCESS_ALLOWED_ACE_TYPE)
+ continue;
+
+ if (RtlEqualSid((PSID)WorldSid,
+ (PSID)&((PACCESS_ALLOWED_ACE)LocalAce)->SidStart))
+ {
+ *Ace = (PACCESS_ALLOWED_ACE)LocalAce;
+ return STATUS_SUCCESS;
+ }
+ }
+
+ return STATUS_SUCCESS;
+}
+
+
static
ULONG
-GetAccountFlags(ULONG AccountControl)
+GetAccountFlags(ULONG AccountControl,
+ PACL Dacl)
{
+ PACCESS_ALLOWED_ACE Ace = NULL;
ULONG Flags = UF_SCRIPT;
+ NTSTATUS Status;
+
+ if (Dacl != NULL)
+ {
+ Status = GetAllowedWorldAce(Dacl, &Ace);
+ if (NT_SUCCESS(Status))
+ {
+ if (Ace == NULL)
+ {
+ Flags |= UF_PASSWD_CANT_CHANGE;
+ }
+ else if ((Ace->Mask & USER_CHANGE_PASSWORD) == 0)
+ {
+ Flags |= UF_PASSWD_CANT_CHANGE;
+ }
+ }
+ }
if (AccountControl & USER_ACCOUNT_DISABLED)
Flags |= UF_ACCOUNTDISABLE;
if (AccountControl & USER_PASSWORD_NOT_REQUIRED)
Flags |= UF_PASSWD_NOTREQD;
-// UF_PASSWD_CANT_CHANGE
-
if (AccountControl & USER_ACCOUNT_AUTO_LOCKED)
Flags |= UF_LOCKOUT;
}
+static
+VOID
+ChangeUserDacl(IN PACL Dacl,
+ IN ULONG Flags)
+{
+ PACCESS_ALLOWED_ACE Ace = NULL;
+ NTSTATUS Status;
+
+ if (Dacl == NULL)
+ return;
+
+ Status = GetAllowedWorldAce(Dacl, &Ace);
+ if (!NT_SUCCESS(Status))
+ return;
+
+ if (Flags & UF_PASSWD_CANT_CHANGE)
+ Ace->Mask &= ~USER_CHANGE_PASSWORD;
+ else
+ Ace->Mask |= USER_CHANGE_PASSWORD;
+}
+
+
+static
+NET_API_STATUS
+GetUserDacl(IN SAM_HANDLE UserHandle,
+ OUT PACL *Dacl)
+{
+ PSECURITY_DESCRIPTOR SecurityDescriptor = NULL;
+ PACL SamDacl;
+ PACL LocalDacl;
+ BOOLEAN Defaulted;
+ BOOLEAN Present;
+ ACL_SIZE_INFORMATION AclSize;
+ NET_API_STATUS ApiStatus;
+ NTSTATUS Status;
+
+ TRACE("(%p %p)\n", UserHandle, Dacl);
+
+ *Dacl = NULL;
+
+ Status = SamQuerySecurityObject(UserHandle,
+ DACL_SECURITY_INFORMATION,
+ &SecurityDescriptor);
+ if (!NT_SUCCESS(Status))
+ {
+ TRACE("SamQuerySecurityObject() failed (Status 0x%08lx)\n", Status);
+ ApiStatus = NetpNtStatusToApiStatus(Status);
+ goto done;
+ }
+
+ Status = RtlGetDaclSecurityDescriptor(SecurityDescriptor,
+ &Present,
+ &SamDacl,
+ &Defaulted);
+ if (!NT_SUCCESS(Status))
+ {
+ TRACE("RtlGetDaclSecurityDescriptor() failed (Status 0x%08lx)\n", Status);
+ ApiStatus = NERR_InternalError;
+ goto done;
+ }
+
+ if (Present == FALSE)
+ {
+ TRACE("No DACL present\n");
+ ApiStatus = NERR_Success;
+ goto done;
+ }
+
+ Status = RtlQueryInformationAcl(SamDacl,
+ &AclSize,
+ sizeof(AclSize),
+ AclSizeInformation);
+ if (!NT_SUCCESS(Status))
+ {
+ TRACE("RtlQueryInformationAcl() failed (Status 0x%08lx)\n", Status);
+ ApiStatus = NERR_InternalError;
+ goto done;
+ }
+
+ LocalDacl = HeapAlloc(GetProcessHeap(), 0, AclSize.AclBytesInUse);
+ if (LocalDacl == NULL)
+ {
+ TRACE("Memory allocation failed\n");
+ ApiStatus = ERROR_NOT_ENOUGH_MEMORY;
+ goto done;
+ }
+
+ RtlCopyMemory(LocalDacl, SamDacl, AclSize.AclBytesInUse);
+
+ *Dacl = LocalDacl;
+
+ ApiStatus = NERR_Success;
+
+done:
+ if (SecurityDescriptor != NULL)
+ SamFreeMemory(SecurityDescriptor);
+
+ TRACE("done (ApiStatus: 0x%08lx)\n", ApiStatus);
+
+ return ApiStatus;
+}
+
+
static
VOID
FreeUserInfo(PUSER_ALL_INFORMATION UserInfo)
UNICODE_STRING LogonServer = RTL_CONSTANT_STRING(L"\\\\*");
PUSER_ALL_INFORMATION UserInfo = NULL;
LPVOID LocalBuffer = NULL;
+ PACL Dacl = NULL;
PUSER_INFO_0 UserInfo0;
PUSER_INFO_1 UserInfo1;
PUSER_INFO_2 UserInfo2;
goto done;
}
+ if ((level == 1) || (level == 2) || (level == 3) ||
+ (level == 4) || (level == 20) || (level == 23))
+ {
+ ApiStatus = GetUserDacl(UserHandle, &Dacl);
+ if (ApiStatus != NERR_Success)
+ goto done;
+ }
+
switch (level)
{
case 0:
case 1:
Size = sizeof(USER_INFO_1) +
- UserInfo->UserName.Length + sizeof(WCHAR);
-
- if (UserInfo->HomeDirectory.Length > 0)
- Size += UserInfo->HomeDirectory.Length + sizeof(WCHAR);
-
- if (UserInfo->AdminComment.Length > 0)
- Size += UserInfo->AdminComment.Length + sizeof(WCHAR);
-
- if (UserInfo->ScriptPath.Length > 0)
- Size += UserInfo->ScriptPath.Length + sizeof(WCHAR);
+ UserInfo->UserName.Length + sizeof(WCHAR) +
+ UserInfo->HomeDirectory.Length + sizeof(WCHAR) +
+ UserInfo->AdminComment.Length + sizeof(WCHAR) +
+ UserInfo->ScriptPath.Length + sizeof(WCHAR);
break;
case 2:
Size = sizeof(USER_INFO_2) +
- UserInfo->UserName.Length + sizeof(WCHAR);
-
- if (UserInfo->HomeDirectory.Length > 0)
- Size += UserInfo->HomeDirectory.Length + sizeof(WCHAR);
-
- if (UserInfo->AdminComment.Length > 0)
- Size += UserInfo->AdminComment.Length + sizeof(WCHAR);
-
- if (UserInfo->ScriptPath.Length > 0)
- Size += UserInfo->ScriptPath.Length + sizeof(WCHAR);
-
- if (UserInfo->FullName.Length > 0)
- Size += UserInfo->FullName.Length + sizeof(WCHAR);
-
- if (UserInfo->UserComment.Length > 0)
- Size += UserInfo->UserComment.Length + sizeof(WCHAR);
-
- if (UserInfo->Parameters.Length > 0)
- Size += UserInfo->Parameters.Length + sizeof(WCHAR);
-
- if (UserInfo->WorkStations.Length > 0)
- Size += UserInfo->WorkStations.Length + sizeof(WCHAR);
+ UserInfo->UserName.Length + sizeof(WCHAR) +
+ UserInfo->HomeDirectory.Length + sizeof(WCHAR) +
+ UserInfo->AdminComment.Length + sizeof(WCHAR) +
+ UserInfo->ScriptPath.Length + sizeof(WCHAR) +
+ UserInfo->FullName.Length + sizeof(WCHAR) +
+ UserInfo->UserComment.Length + sizeof(WCHAR) +
+ UserInfo->Parameters.Length + sizeof(WCHAR) +
+ UserInfo->WorkStations.Length + sizeof(WCHAR) +
+ LogonServer.Length + sizeof(WCHAR);
if (UserInfo->LogonHours.UnitsPerWeek > 0)
Size += (((ULONG)UserInfo->LogonHours.UnitsPerWeek) + 7) / 8;
-
- if (LogonServer.Length > 0)
- Size += LogonServer.Length + sizeof(WCHAR);
break;
case 3:
Size = sizeof(USER_INFO_3) +
- UserInfo->UserName.Length + sizeof(WCHAR);
-
- if (UserInfo->HomeDirectory.Length > 0)
- Size += UserInfo->HomeDirectory.Length + sizeof(WCHAR);
-
- if (UserInfo->AdminComment.Length > 0)
- Size += UserInfo->AdminComment.Length + sizeof(WCHAR);
-
- if (UserInfo->ScriptPath.Length > 0)
- Size += UserInfo->ScriptPath.Length + sizeof(WCHAR);
-
- if (UserInfo->FullName.Length > 0)
- Size += UserInfo->FullName.Length + sizeof(WCHAR);
-
- if (UserInfo->UserComment.Length > 0)
- Size += UserInfo->UserComment.Length + sizeof(WCHAR);
-
- if (UserInfo->Parameters.Length > 0)
- Size += UserInfo->Parameters.Length + sizeof(WCHAR);
-
- if (UserInfo->WorkStations.Length > 0)
- Size += UserInfo->WorkStations.Length + sizeof(WCHAR);
+ UserInfo->UserName.Length + sizeof(WCHAR) +
+ UserInfo->HomeDirectory.Length + sizeof(WCHAR) +
+ UserInfo->AdminComment.Length + sizeof(WCHAR) +
+ UserInfo->ScriptPath.Length + sizeof(WCHAR) +
+ UserInfo->FullName.Length + sizeof(WCHAR) +
+ UserInfo->UserComment.Length + sizeof(WCHAR) +
+ UserInfo->Parameters.Length + sizeof(WCHAR) +
+ UserInfo->WorkStations.Length + sizeof(WCHAR) +
+ LogonServer.Length + sizeof(WCHAR) +
+ UserInfo->ProfilePath.Length + sizeof(WCHAR) +
+ UserInfo->HomeDirectoryDrive.Length + sizeof(WCHAR);
if (UserInfo->LogonHours.UnitsPerWeek > 0)
Size += (((ULONG)UserInfo->LogonHours.UnitsPerWeek) + 7) / 8;
-
- if (LogonServer.Length > 0)
- Size += LogonServer.Length + sizeof(WCHAR);
-
- if (UserInfo->ProfilePath.Length > 0)
- Size += UserInfo->ProfilePath.Length + sizeof(WCHAR);
-
- if (UserInfo->HomeDirectoryDrive.Length > 0)
- Size += UserInfo->HomeDirectoryDrive.Length + sizeof(WCHAR);
break;
case 4:
Size = sizeof(USER_INFO_4) +
- UserInfo->UserName.Length + sizeof(WCHAR);
-
- if (UserInfo->HomeDirectory.Length > 0)
- Size += UserInfo->HomeDirectory.Length + sizeof(WCHAR);
-
- if (UserInfo->AdminComment.Length > 0)
- Size += UserInfo->AdminComment.Length + sizeof(WCHAR);
-
- if (UserInfo->ScriptPath.Length > 0)
- Size += UserInfo->ScriptPath.Length + sizeof(WCHAR);
-
- if (UserInfo->FullName.Length > 0)
- Size += UserInfo->FullName.Length + sizeof(WCHAR);
-
- if (UserInfo->UserComment.Length > 0)
- Size += UserInfo->UserComment.Length + sizeof(WCHAR);
-
- if (UserInfo->Parameters.Length > 0)
- Size += UserInfo->Parameters.Length + sizeof(WCHAR);
-
- if (UserInfo->WorkStations.Length > 0)
- Size += UserInfo->WorkStations.Length + sizeof(WCHAR);
+ UserInfo->UserName.Length + sizeof(WCHAR) +
+ UserInfo->HomeDirectory.Length + sizeof(WCHAR) +
+ UserInfo->AdminComment.Length + sizeof(WCHAR) +
+ UserInfo->ScriptPath.Length + sizeof(WCHAR) +
+ UserInfo->FullName.Length + sizeof(WCHAR) +
+ UserInfo->UserComment.Length + sizeof(WCHAR) +
+ UserInfo->Parameters.Length + sizeof(WCHAR) +
+ UserInfo->WorkStations.Length + sizeof(WCHAR) +
+ LogonServer.Length + sizeof(WCHAR) +
+ UserInfo->ProfilePath.Length + sizeof(WCHAR) +
+ UserInfo->HomeDirectoryDrive.Length + sizeof(WCHAR);
if (UserInfo->LogonHours.UnitsPerWeek > 0)
Size += (((ULONG)UserInfo->LogonHours.UnitsPerWeek) + 7) / 8;
- if (LogonServer.Length > 0)
- Size += LogonServer.Length + sizeof(WCHAR);
-
/* FIXME: usri4_user_sid */
-
- if (UserInfo->ProfilePath.Length > 0)
- Size += UserInfo->ProfilePath.Length + sizeof(WCHAR);
-
- if (UserInfo->HomeDirectoryDrive.Length > 0)
- Size += UserInfo->HomeDirectoryDrive.Length + sizeof(WCHAR);
break;
case 10:
Size = sizeof(USER_INFO_10) +
- UserInfo->UserName.Length + sizeof(WCHAR);
-
- if (UserInfo->AdminComment.Length > 0)
- Size += UserInfo->AdminComment.Length + sizeof(WCHAR);
-
- if (UserInfo->UserComment.Length > 0)
- Size += UserInfo->UserComment.Length + sizeof(WCHAR);
-
- if (UserInfo->FullName.Length > 0)
- Size += UserInfo->FullName.Length + sizeof(WCHAR);
+ UserInfo->UserName.Length + sizeof(WCHAR) +
+ UserInfo->AdminComment.Length + sizeof(WCHAR) +
+ UserInfo->UserComment.Length + sizeof(WCHAR) +
+ UserInfo->FullName.Length + sizeof(WCHAR);
break;
case 11:
Size = sizeof(USER_INFO_11) +
- UserInfo->UserName.Length + sizeof(WCHAR);
-
- if (UserInfo->AdminComment.Length > 0)
- Size += UserInfo->AdminComment.Length + sizeof(WCHAR);
-
- if (UserInfo->UserComment.Length > 0)
- Size += UserInfo->UserComment.Length + sizeof(WCHAR);
-
- if (UserInfo->FullName.Length > 0)
- Size += UserInfo->FullName.Length + sizeof(WCHAR);
-
- if (UserInfo->HomeDirectory.Length > 0)
- Size += UserInfo->HomeDirectory.Length + sizeof(WCHAR);
-
- if (UserInfo->Parameters.Length > 0)
- Size += UserInfo->Parameters.Length + sizeof(WCHAR);
-
- if (LogonServer.Length > 0)
- Size += LogonServer.Length + sizeof(WCHAR);
-
- if (UserInfo->WorkStations.Length > 0)
- Size += UserInfo->WorkStations.Length + sizeof(WCHAR);
+ UserInfo->UserName.Length + sizeof(WCHAR) +
+ UserInfo->AdminComment.Length + sizeof(WCHAR) +
+ UserInfo->UserComment.Length + sizeof(WCHAR) +
+ UserInfo->FullName.Length + sizeof(WCHAR) +
+ UserInfo->HomeDirectory.Length + sizeof(WCHAR) +
+ UserInfo->Parameters.Length + sizeof(WCHAR) +
+ LogonServer.Length + sizeof(WCHAR) +
+ UserInfo->WorkStations.Length + sizeof(WCHAR);
if (UserInfo->LogonHours.UnitsPerWeek > 0)
Size += (((ULONG)UserInfo->LogonHours.UnitsPerWeek) + 7) / 8;
case 20:
Size = sizeof(USER_INFO_20) +
- UserInfo->UserName.Length + sizeof(WCHAR);
-
- if (UserInfo->FullName.Length > 0)
- Size += UserInfo->FullName.Length + sizeof(WCHAR);
-
- if (UserInfo->AdminComment.Length > 0)
- Size += UserInfo->AdminComment.Length + sizeof(WCHAR);
+ UserInfo->UserName.Length + sizeof(WCHAR) +
+ UserInfo->FullName.Length + sizeof(WCHAR) +
+ UserInfo->AdminComment.Length + sizeof(WCHAR);
break;
case 23:
Size = sizeof(USER_INFO_23) +
- UserInfo->UserName.Length + sizeof(WCHAR);
-
- if (UserInfo->FullName.Length > 0)
- Size += UserInfo->FullName.Length + sizeof(WCHAR);
-
- if (UserInfo->AdminComment.Length > 0)
- Size += UserInfo->AdminComment.Length + sizeof(WCHAR);
+ UserInfo->UserName.Length + sizeof(WCHAR) +
+ UserInfo->FullName.Length + sizeof(WCHAR) +
+ UserInfo->AdminComment.Length + sizeof(WCHAR);
/* FIXME: usri23_user_sid */
break;
UserInfo0 = (PUSER_INFO_0)LocalBuffer;
Ptr = (LPWSTR)((ULONG_PTR)UserInfo0 + sizeof(USER_INFO_0));
+
UserInfo0->usri0_name = Ptr;
memcpy(UserInfo0->usri0_name,
Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->UserName.Length + sizeof(WCHAR));
UserInfo1->usri1_password = NULL;
-
UserInfo1->usri1_password_age = GetPasswordAge(&UserInfo->PasswordLastSet);
- /* FIXME: UserInfo1->usri1_priv */
-
- if (UserInfo->HomeDirectory.Length > 0)
- {
- UserInfo1->usri1_home_dir = Ptr;
-
- memcpy(UserInfo1->usri1_home_dir,
- UserInfo->HomeDirectory.Buffer,
- UserInfo->HomeDirectory.Length);
- UserInfo1->usri1_home_dir[UserInfo->HomeDirectory.Length / sizeof(WCHAR)] = UNICODE_NULL;
-
- Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->HomeDirectory.Length + sizeof(WCHAR));
- }
-
- if (UserInfo->AdminComment.Length > 0)
- {
- UserInfo1->usri1_comment = Ptr;
-
- memcpy(UserInfo1->usri1_comment,
- UserInfo->AdminComment.Buffer,
- UserInfo->AdminComment.Length);
- UserInfo1->usri1_comment[UserInfo->AdminComment.Length / sizeof(WCHAR)] = UNICODE_NULL;
-
- Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->AdminComment.Length + sizeof(WCHAR));
- }
-
- UserInfo1->usri1_flags = GetAccountFlags(UserInfo->UserAccountControl);
-
- if (UserInfo->ScriptPath.Length > 0)
- {
- UserInfo1->usri1_script_path = Ptr;
-
- memcpy(UserInfo1->usri1_script_path,
- UserInfo->ScriptPath.Buffer,
- UserInfo->ScriptPath.Length);
- UserInfo1->usri1_script_path[UserInfo->ScriptPath.Length / sizeof(WCHAR)] = UNICODE_NULL;
- }
+ /* FIXME: usri1_priv */
+
+ UserInfo1->usri1_home_dir = Ptr;
+ memcpy(UserInfo1->usri1_home_dir,
+ UserInfo->HomeDirectory.Buffer,
+ UserInfo->HomeDirectory.Length);
+ UserInfo1->usri1_home_dir[UserInfo->HomeDirectory.Length / sizeof(WCHAR)] = UNICODE_NULL;
+ Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->HomeDirectory.Length + sizeof(WCHAR));
+
+ UserInfo1->usri1_comment = Ptr;
+ memcpy(UserInfo1->usri1_comment,
+ UserInfo->AdminComment.Buffer,
+ UserInfo->AdminComment.Length);
+ UserInfo1->usri1_comment[UserInfo->AdminComment.Length / sizeof(WCHAR)] = UNICODE_NULL;
+ Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->AdminComment.Length + sizeof(WCHAR));
+
+ UserInfo1->usri1_flags = GetAccountFlags(UserInfo->UserAccountControl,
+ Dacl);
+
+ UserInfo1->usri1_script_path = Ptr;
+ memcpy(UserInfo1->usri1_script_path,
+ UserInfo->ScriptPath.Buffer,
+ UserInfo->ScriptPath.Length);
+ UserInfo1->usri1_script_path[UserInfo->ScriptPath.Length / sizeof(WCHAR)] = UNICODE_NULL;
break;
case 2:
Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->UserName.Length + sizeof(WCHAR));
+ UserInfo2->usri2_password = NULL;
UserInfo2->usri2_password_age = GetPasswordAge(&UserInfo->PasswordLastSet);
/* FIXME: usri2_priv */
- if (UserInfo->HomeDirectory.Length > 0)
- {
- UserInfo2->usri2_home_dir = Ptr;
-
- memcpy(UserInfo2->usri2_home_dir,
- UserInfo->HomeDirectory.Buffer,
- UserInfo->HomeDirectory.Length);
- UserInfo2->usri2_home_dir[UserInfo->HomeDirectory.Length / sizeof(WCHAR)] = UNICODE_NULL;
-
- Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->HomeDirectory.Length + sizeof(WCHAR));
- }
-
- if (UserInfo->AdminComment.Length > 0)
- {
- UserInfo2->usri2_comment = Ptr;
-
- memcpy(UserInfo2->usri2_comment,
- UserInfo->AdminComment.Buffer,
- UserInfo->AdminComment.Length);
- UserInfo2->usri2_comment[UserInfo->AdminComment.Length / sizeof(WCHAR)] = UNICODE_NULL;
-
- Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->AdminComment.Length + sizeof(WCHAR));
- }
-
- UserInfo2->usri2_flags = GetAccountFlags(UserInfo->UserAccountControl);
-
- if (UserInfo->ScriptPath.Length > 0)
- {
- UserInfo2->usri2_script_path = Ptr;
-
- memcpy(UserInfo2->usri2_script_path,
- UserInfo->ScriptPath.Buffer,
- UserInfo->ScriptPath.Length);
- UserInfo2->usri2_script_path[UserInfo->ScriptPath.Length / sizeof(WCHAR)] = UNICODE_NULL;
-
- Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->ScriptPath.Length + sizeof(WCHAR));
- }
+ UserInfo2->usri2_home_dir = Ptr;
+ memcpy(UserInfo2->usri2_home_dir,
+ UserInfo->HomeDirectory.Buffer,
+ UserInfo->HomeDirectory.Length);
+ UserInfo2->usri2_home_dir[UserInfo->HomeDirectory.Length / sizeof(WCHAR)] = UNICODE_NULL;
+ Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->HomeDirectory.Length + sizeof(WCHAR));
+
+ UserInfo2->usri2_comment = Ptr;
+ memcpy(UserInfo2->usri2_comment,
+ UserInfo->AdminComment.Buffer,
+ UserInfo->AdminComment.Length);
+ UserInfo2->usri2_comment[UserInfo->AdminComment.Length / sizeof(WCHAR)] = UNICODE_NULL;
+ Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->AdminComment.Length + sizeof(WCHAR));
+
+ UserInfo2->usri2_flags = GetAccountFlags(UserInfo->UserAccountControl,
+ Dacl);
+
+ UserInfo2->usri2_script_path = Ptr;
+ memcpy(UserInfo2->usri2_script_path,
+ UserInfo->ScriptPath.Buffer,
+ UserInfo->ScriptPath.Length);
+ UserInfo2->usri2_script_path[UserInfo->ScriptPath.Length / sizeof(WCHAR)] = UNICODE_NULL;
+ Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->ScriptPath.Length + sizeof(WCHAR));
/* FIXME: usri2_auth_flags */
- if (UserInfo->FullName.Length > 0)
- {
- UserInfo2->usri2_full_name = Ptr;
-
- memcpy(UserInfo2->usri2_full_name,
- UserInfo->FullName.Buffer,
- UserInfo->FullName.Length);
- UserInfo2->usri2_full_name[UserInfo->FullName.Length / sizeof(WCHAR)] = UNICODE_NULL;
-
- Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->FullName.Length + sizeof(WCHAR));
- }
-
- if (UserInfo->UserComment.Length > 0)
- {
- UserInfo2->usri2_usr_comment = Ptr;
-
- memcpy(UserInfo2->usri2_usr_comment,
- UserInfo->UserComment.Buffer,
- UserInfo->UserComment.Length);
- UserInfo2->usri2_usr_comment[UserInfo->UserComment.Length / sizeof(WCHAR)] = UNICODE_NULL;
-
- Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->UserComment.Length + sizeof(WCHAR));
- }
-
- if (UserInfo->Parameters.Length > 0)
- {
- UserInfo2->usri2_parms = Ptr;
-
- memcpy(UserInfo2->usri2_parms,
- UserInfo->Parameters.Buffer,
- UserInfo->Parameters.Length);
- UserInfo2->usri2_parms[UserInfo->Parameters.Length / sizeof(WCHAR)] = UNICODE_NULL;
-
- Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->Parameters.Length + sizeof(WCHAR));
- }
-
- if (UserInfo->WorkStations.Length > 0)
- {
- UserInfo2->usri2_workstations = Ptr;
-
- memcpy(UserInfo2->usri2_workstations,
- UserInfo->WorkStations.Buffer,
- UserInfo->WorkStations.Length);
- UserInfo2->usri2_workstations[UserInfo->WorkStations.Length / sizeof(WCHAR)] = UNICODE_NULL;
-
- Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->WorkStations.Length + sizeof(WCHAR));
- }
+ UserInfo2->usri2_full_name = Ptr;
+ memcpy(UserInfo2->usri2_full_name,
+ UserInfo->FullName.Buffer,
+ UserInfo->FullName.Length);
+ UserInfo2->usri2_full_name[UserInfo->FullName.Length / sizeof(WCHAR)] = UNICODE_NULL;
+ Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->FullName.Length + sizeof(WCHAR));
+
+ UserInfo2->usri2_usr_comment = Ptr;
+ memcpy(UserInfo2->usri2_usr_comment,
+ UserInfo->UserComment.Buffer,
+ UserInfo->UserComment.Length);
+ UserInfo2->usri2_usr_comment[UserInfo->UserComment.Length / sizeof(WCHAR)] = UNICODE_NULL;
+ Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->UserComment.Length + sizeof(WCHAR));
+
+ UserInfo2->usri2_parms = Ptr;
+ memcpy(UserInfo2->usri2_parms,
+ UserInfo->Parameters.Buffer,
+ UserInfo->Parameters.Length);
+ UserInfo2->usri2_parms[UserInfo->Parameters.Length / sizeof(WCHAR)] = UNICODE_NULL;
+ Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->Parameters.Length + sizeof(WCHAR));
+
+ UserInfo2->usri2_workstations = Ptr;
+ memcpy(UserInfo2->usri2_workstations,
+ UserInfo->WorkStations.Buffer,
+ UserInfo->WorkStations.Length);
+ UserInfo2->usri2_workstations[UserInfo->WorkStations.Length / sizeof(WCHAR)] = UNICODE_NULL;
+ Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->WorkStations.Length + sizeof(WCHAR));
RtlTimeToSecondsSince1970(&UserInfo->LastLogon,
&UserInfo2->usri2_last_logon);
UserInfo2->usri2_bad_pw_count = UserInfo->BadPasswordCount;
UserInfo2->usri2_num_logons = UserInfo->LogonCount;
- if (LogonServer.Length > 0)
- {
- UserInfo2->usri2_logon_server = Ptr;
-
- memcpy(UserInfo2->usri2_logon_server,
- LogonServer.Buffer,
- LogonServer.Length);
- UserInfo2->usri2_logon_server[LogonServer.Length / sizeof(WCHAR)] = UNICODE_NULL;
-
- Ptr = (LPWSTR)((ULONG_PTR)Ptr + LogonServer.Length + sizeof(WCHAR));
- }
+ UserInfo2->usri2_logon_server = Ptr;
+ memcpy(UserInfo2->usri2_logon_server,
+ LogonServer.Buffer,
+ LogonServer.Length);
+ UserInfo2->usri2_logon_server[LogonServer.Length / sizeof(WCHAR)] = UNICODE_NULL;
+ Ptr = (LPWSTR)((ULONG_PTR)Ptr + LogonServer.Length + sizeof(WCHAR));
UserInfo2->usri2_country_code = UserInfo->CountryCode;
UserInfo2->usri2_code_page = UserInfo->CodePage;
Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->UserName.Length + sizeof(WCHAR));
+ UserInfo3->usri3_password = NULL;
UserInfo3->usri3_password_age = GetPasswordAge(&UserInfo->PasswordLastSet);
/* FIXME: usri3_priv */
- if (UserInfo->HomeDirectory.Length > 0)
- {
- UserInfo3->usri3_home_dir = Ptr;
-
- memcpy(UserInfo3->usri3_home_dir,
- UserInfo->HomeDirectory.Buffer,
- UserInfo->HomeDirectory.Length);
- UserInfo3->usri3_home_dir[UserInfo->HomeDirectory.Length / sizeof(WCHAR)] = UNICODE_NULL;
-
- Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->HomeDirectory.Length + sizeof(WCHAR));
- }
-
- if (UserInfo->AdminComment.Length > 0)
- {
- UserInfo3->usri3_comment = Ptr;
-
- memcpy(UserInfo3->usri3_comment,
- UserInfo->AdminComment.Buffer,
- UserInfo->AdminComment.Length);
- UserInfo3->usri3_comment[UserInfo->AdminComment.Length / sizeof(WCHAR)] = UNICODE_NULL;
-
- Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->AdminComment.Length + sizeof(WCHAR));
- }
-
- UserInfo3->usri3_flags = GetAccountFlags(UserInfo->UserAccountControl);
-
- if (UserInfo->ScriptPath.Length > 0)
- {
- UserInfo3->usri3_script_path = Ptr;
-
- memcpy(UserInfo3->usri3_script_path,
- UserInfo->ScriptPath.Buffer,
- UserInfo->ScriptPath.Length);
- UserInfo3->usri3_script_path[UserInfo->ScriptPath.Length / sizeof(WCHAR)] = UNICODE_NULL;
-
- Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->ScriptPath.Length + sizeof(WCHAR));
- }
+ UserInfo3->usri3_home_dir = Ptr;
+ memcpy(UserInfo3->usri3_home_dir,
+ UserInfo->HomeDirectory.Buffer,
+ UserInfo->HomeDirectory.Length);
+ UserInfo3->usri3_home_dir[UserInfo->HomeDirectory.Length / sizeof(WCHAR)] = UNICODE_NULL;
+ Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->HomeDirectory.Length + sizeof(WCHAR));
+
+ UserInfo3->usri3_comment = Ptr;
+ memcpy(UserInfo3->usri3_comment,
+ UserInfo->AdminComment.Buffer,
+ UserInfo->AdminComment.Length);
+ UserInfo3->usri3_comment[UserInfo->AdminComment.Length / sizeof(WCHAR)] = UNICODE_NULL;
+ Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->AdminComment.Length + sizeof(WCHAR));
+
+ UserInfo3->usri3_flags = GetAccountFlags(UserInfo->UserAccountControl,
+ Dacl);
+
+ UserInfo3->usri3_script_path = Ptr;
+ memcpy(UserInfo3->usri3_script_path,
+ UserInfo->ScriptPath.Buffer,
+ UserInfo->ScriptPath.Length);
+ UserInfo3->usri3_script_path[UserInfo->ScriptPath.Length / sizeof(WCHAR)] = UNICODE_NULL;
+ Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->ScriptPath.Length + sizeof(WCHAR));
/* FIXME: usri3_auth_flags */
- if (UserInfo->FullName.Length > 0)
- {
- UserInfo3->usri3_full_name = Ptr;
-
- memcpy(UserInfo3->usri3_full_name,
- UserInfo->FullName.Buffer,
- UserInfo->FullName.Length);
- UserInfo3->usri3_full_name[UserInfo->FullName.Length / sizeof(WCHAR)] = UNICODE_NULL;
-
- Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->FullName.Length + sizeof(WCHAR));
- }
-
- if (UserInfo->UserComment.Length > 0)
- {
- UserInfo3->usri3_usr_comment = Ptr;
-
- memcpy(UserInfo3->usri3_usr_comment,
- UserInfo->UserComment.Buffer,
- UserInfo->UserComment.Length);
- UserInfo3->usri3_usr_comment[UserInfo->UserComment.Length / sizeof(WCHAR)] = UNICODE_NULL;
-
- Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->UserComment.Length + sizeof(WCHAR));
- }
-
- if (UserInfo->Parameters.Length > 0)
- {
- UserInfo3->usri3_parms = Ptr;
-
- memcpy(UserInfo3->usri3_parms,
- UserInfo->Parameters.Buffer,
- UserInfo->Parameters.Length);
- UserInfo3->usri3_parms[UserInfo->Parameters.Length / sizeof(WCHAR)] = UNICODE_NULL;
-
- Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->Parameters.Length + sizeof(WCHAR));
- }
-
- if (UserInfo->WorkStations.Length > 0)
- {
- UserInfo3->usri3_workstations = Ptr;
-
- memcpy(UserInfo3->usri3_workstations,
- UserInfo->WorkStations.Buffer,
- UserInfo->WorkStations.Length);
- UserInfo3->usri3_workstations[UserInfo->WorkStations.Length / sizeof(WCHAR)] = UNICODE_NULL;
-
- Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->WorkStations.Length + sizeof(WCHAR));
- }
+ UserInfo3->usri3_full_name = Ptr;
+ memcpy(UserInfo3->usri3_full_name,
+ UserInfo->FullName.Buffer,
+ UserInfo->FullName.Length);
+ UserInfo3->usri3_full_name[UserInfo->FullName.Length / sizeof(WCHAR)] = UNICODE_NULL;
+ Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->FullName.Length + sizeof(WCHAR));
+
+ UserInfo3->usri3_usr_comment = Ptr;
+ memcpy(UserInfo3->usri3_usr_comment,
+ UserInfo->UserComment.Buffer,
+ UserInfo->UserComment.Length);
+ UserInfo3->usri3_usr_comment[UserInfo->UserComment.Length / sizeof(WCHAR)] = UNICODE_NULL;
+ Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->UserComment.Length + sizeof(WCHAR));
+
+ UserInfo3->usri3_parms = Ptr;
+ memcpy(UserInfo3->usri3_parms,
+ UserInfo->Parameters.Buffer,
+ UserInfo->Parameters.Length);
+ UserInfo3->usri3_parms[UserInfo->Parameters.Length / sizeof(WCHAR)] = UNICODE_NULL;
+ Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->Parameters.Length + sizeof(WCHAR));
+
+ UserInfo3->usri3_workstations = Ptr;
+ memcpy(UserInfo3->usri3_workstations,
+ UserInfo->WorkStations.Buffer,
+ UserInfo->WorkStations.Length);
+ UserInfo3->usri3_workstations[UserInfo->WorkStations.Length / sizeof(WCHAR)] = UNICODE_NULL;
+ Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->WorkStations.Length + sizeof(WCHAR));
RtlTimeToSecondsSince1970(&UserInfo->LastLogon,
&UserInfo3->usri3_last_logon);
UserInfo3->usri3_bad_pw_count = UserInfo->BadPasswordCount;
UserInfo3->usri3_num_logons = UserInfo->LogonCount;
- if (LogonServer.Length > 0)
- {
- UserInfo3->usri3_logon_server = Ptr;
-
- memcpy(UserInfo3->usri3_logon_server,
- LogonServer.Buffer,
- LogonServer.Length);
- UserInfo3->usri3_logon_server[LogonServer.Length / sizeof(WCHAR)] = UNICODE_NULL;
-
- Ptr = (LPWSTR)((ULONG_PTR)Ptr + LogonServer.Length + sizeof(WCHAR));
- }
+ UserInfo3->usri3_logon_server = Ptr;
+ memcpy(UserInfo3->usri3_logon_server,
+ LogonServer.Buffer,
+ LogonServer.Length);
+ UserInfo3->usri3_logon_server[LogonServer.Length / sizeof(WCHAR)] = UNICODE_NULL;
+ Ptr = (LPWSTR)((ULONG_PTR)Ptr + LogonServer.Length + sizeof(WCHAR));
UserInfo3->usri3_country_code = UserInfo->CountryCode;
UserInfo3->usri3_code_page = UserInfo->CodePage;
UserInfo3->usri3_user_id = RelativeId;
UserInfo3->usri3_primary_group_id = UserInfo->PrimaryGroupId;
- if (UserInfo->ProfilePath.Length > 0)
- {
- UserInfo3->usri3_profile = Ptr;
-
- memcpy(UserInfo3->usri3_profile,
- UserInfo->ProfilePath.Buffer,
- UserInfo->ProfilePath.Length);
- UserInfo3->usri3_profile[UserInfo->ProfilePath.Length / sizeof(WCHAR)] = UNICODE_NULL;
-
- Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->ProfilePath.Length + sizeof(WCHAR));
- }
-
- if (UserInfo->HomeDirectoryDrive.Length > 0)
- {
- UserInfo3->usri3_home_dir_drive = Ptr;
-
- memcpy(UserInfo3->usri3_home_dir_drive,
- UserInfo->HomeDirectoryDrive.Buffer,
- UserInfo->HomeDirectoryDrive.Length);
- UserInfo3->usri3_home_dir_drive[UserInfo->HomeDirectoryDrive.Length / sizeof(WCHAR)] = UNICODE_NULL;
+ UserInfo3->usri3_profile = Ptr;
+ memcpy(UserInfo3->usri3_profile,
+ UserInfo->ProfilePath.Buffer,
+ UserInfo->ProfilePath.Length);
+ UserInfo3->usri3_profile[UserInfo->ProfilePath.Length / sizeof(WCHAR)] = UNICODE_NULL;
+ Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->ProfilePath.Length + sizeof(WCHAR));
- Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->HomeDirectoryDrive.Length + sizeof(WCHAR));
- }
+ UserInfo3->usri3_home_dir_drive = Ptr;
+ memcpy(UserInfo3->usri3_home_dir_drive,
+ UserInfo->HomeDirectoryDrive.Buffer,
+ UserInfo->HomeDirectoryDrive.Length);
+ UserInfo3->usri3_home_dir_drive[UserInfo->HomeDirectoryDrive.Length / sizeof(WCHAR)] = UNICODE_NULL;
+ Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->HomeDirectoryDrive.Length + sizeof(WCHAR));
UserInfo3->usri3_password_expired = (UserInfo->UserAccountControl & USER_PASSWORD_EXPIRED);
break;
/* FIXME: usri4_priv */
- if (UserInfo->HomeDirectory.Length > 0)
- {
- UserInfo4->usri4_home_dir = Ptr;
-
- memcpy(UserInfo4->usri4_home_dir,
- UserInfo->HomeDirectory.Buffer,
- UserInfo->HomeDirectory.Length);
- UserInfo4->usri4_home_dir[UserInfo->HomeDirectory.Length / sizeof(WCHAR)] = UNICODE_NULL;
-
- Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->HomeDirectory.Length + sizeof(WCHAR));
- }
-
- if (UserInfo->AdminComment.Length > 0)
- {
- UserInfo4->usri4_comment = Ptr;
-
- memcpy(UserInfo4->usri4_comment,
- UserInfo->AdminComment.Buffer,
- UserInfo->AdminComment.Length);
- UserInfo4->usri4_comment[UserInfo->AdminComment.Length / sizeof(WCHAR)] = UNICODE_NULL;
-
- Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->AdminComment.Length + sizeof(WCHAR));
- }
-
- UserInfo4->usri4_flags = GetAccountFlags(UserInfo->UserAccountControl);
-
- if (UserInfo->ScriptPath.Length > 0)
- {
- UserInfo4->usri4_script_path = Ptr;
-
- memcpy(UserInfo4->usri4_script_path,
- UserInfo->ScriptPath.Buffer,
- UserInfo->ScriptPath.Length);
- UserInfo4->usri4_script_path[UserInfo->ScriptPath.Length / sizeof(WCHAR)] = UNICODE_NULL;
-
- Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->ScriptPath.Length + sizeof(WCHAR));
- }
+ UserInfo4->usri4_home_dir = Ptr;
+ memcpy(UserInfo4->usri4_home_dir,
+ UserInfo->HomeDirectory.Buffer,
+ UserInfo->HomeDirectory.Length);
+ UserInfo4->usri4_home_dir[UserInfo->HomeDirectory.Length / sizeof(WCHAR)] = UNICODE_NULL;
+ Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->HomeDirectory.Length + sizeof(WCHAR));
+
+ UserInfo4->usri4_comment = Ptr;
+ memcpy(UserInfo4->usri4_comment,
+ UserInfo->AdminComment.Buffer,
+ UserInfo->AdminComment.Length);
+ UserInfo4->usri4_comment[UserInfo->AdminComment.Length / sizeof(WCHAR)] = UNICODE_NULL;
+ Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->AdminComment.Length + sizeof(WCHAR));
+
+ UserInfo4->usri4_flags = GetAccountFlags(UserInfo->UserAccountControl,
+ Dacl);
+
+ UserInfo4->usri4_script_path = Ptr;
+ memcpy(UserInfo4->usri4_script_path,
+ UserInfo->ScriptPath.Buffer,
+ UserInfo->ScriptPath.Length);
+ UserInfo4->usri4_script_path[UserInfo->ScriptPath.Length / sizeof(WCHAR)] = UNICODE_NULL;
+ Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->ScriptPath.Length + sizeof(WCHAR));
/* FIXME: usri4_auth_flags */
- if (UserInfo->FullName.Length > 0)
- {
- UserInfo4->usri4_full_name = Ptr;
-
- memcpy(UserInfo4->usri4_full_name,
- UserInfo->FullName.Buffer,
- UserInfo->FullName.Length);
- UserInfo4->usri4_full_name[UserInfo->FullName.Length / sizeof(WCHAR)] = UNICODE_NULL;
-
- Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->FullName.Length + sizeof(WCHAR));
- }
-
- if (UserInfo->UserComment.Length > 0)
- {
- UserInfo4->usri4_usr_comment = Ptr;
-
- memcpy(UserInfo4->usri4_usr_comment,
- UserInfo->UserComment.Buffer,
- UserInfo->UserComment.Length);
- UserInfo4->usri4_usr_comment[UserInfo->UserComment.Length / sizeof(WCHAR)] = UNICODE_NULL;
-
- Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->UserComment.Length + sizeof(WCHAR));
- }
-
- if (UserInfo->Parameters.Length > 0)
- {
- UserInfo4->usri4_parms = Ptr;
-
- memcpy(UserInfo4->usri4_parms,
- UserInfo->Parameters.Buffer,
- UserInfo->Parameters.Length);
- UserInfo4->usri4_parms[UserInfo->Parameters.Length / sizeof(WCHAR)] = UNICODE_NULL;
-
- Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->Parameters.Length + sizeof(WCHAR));
- }
-
- if (UserInfo->WorkStations.Length > 0)
- {
- UserInfo4->usri4_workstations = Ptr;
-
- memcpy(UserInfo4->usri4_workstations,
- UserInfo->WorkStations.Buffer,
- UserInfo->WorkStations.Length);
- UserInfo4->usri4_workstations[UserInfo->WorkStations.Length / sizeof(WCHAR)] = UNICODE_NULL;
-
- Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->WorkStations.Length + sizeof(WCHAR));
- }
+ UserInfo4->usri4_full_name = Ptr;
+ memcpy(UserInfo4->usri4_full_name,
+ UserInfo->FullName.Buffer,
+ UserInfo->FullName.Length);
+ UserInfo4->usri4_full_name[UserInfo->FullName.Length / sizeof(WCHAR)] = UNICODE_NULL;
+ Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->FullName.Length + sizeof(WCHAR));
+
+ UserInfo4->usri4_usr_comment = Ptr;
+ memcpy(UserInfo4->usri4_usr_comment,
+ UserInfo->UserComment.Buffer,
+ UserInfo->UserComment.Length);
+ UserInfo4->usri4_usr_comment[UserInfo->UserComment.Length / sizeof(WCHAR)] = UNICODE_NULL;
+ Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->UserComment.Length + sizeof(WCHAR));
+
+ UserInfo4->usri4_parms = Ptr;
+ memcpy(UserInfo4->usri4_parms,
+ UserInfo->Parameters.Buffer,
+ UserInfo->Parameters.Length);
+ UserInfo4->usri4_parms[UserInfo->Parameters.Length / sizeof(WCHAR)] = UNICODE_NULL;
+ Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->Parameters.Length + sizeof(WCHAR));
+
+ UserInfo4->usri4_workstations = Ptr;
+ memcpy(UserInfo4->usri4_workstations,
+ UserInfo->WorkStations.Buffer,
+ UserInfo->WorkStations.Length);
+ UserInfo4->usri4_workstations[UserInfo->WorkStations.Length / sizeof(WCHAR)] = UNICODE_NULL;
+ Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->WorkStations.Length + sizeof(WCHAR));
RtlTimeToSecondsSince1970(&UserInfo->LastLogon,
&UserInfo4->usri4_last_logon);
UserInfo4->usri4_bad_pw_count = UserInfo->BadPasswordCount;
UserInfo4->usri4_num_logons = UserInfo->LogonCount;
- if (LogonServer.Length > 0)
- {
- UserInfo4->usri4_logon_server = Ptr;
-
- memcpy(UserInfo4->usri4_logon_server,
- LogonServer.Buffer,
- LogonServer.Length);
- UserInfo4->usri4_logon_server[LogonServer.Length / sizeof(WCHAR)] = UNICODE_NULL;
-
- Ptr = (LPWSTR)((ULONG_PTR)Ptr + LogonServer.Length + sizeof(WCHAR));
- }
+ UserInfo4->usri4_logon_server = Ptr;
+ memcpy(UserInfo4->usri4_logon_server,
+ LogonServer.Buffer,
+ LogonServer.Length);
+ UserInfo4->usri4_logon_server[LogonServer.Length / sizeof(WCHAR)] = UNICODE_NULL;
+ Ptr = (LPWSTR)((ULONG_PTR)Ptr + LogonServer.Length + sizeof(WCHAR));
UserInfo4->usri4_country_code = UserInfo->CountryCode;
UserInfo4->usri4_code_page = UserInfo->CodePage;
UserInfo4->usri4_primary_group_id = UserInfo->PrimaryGroupId;
- if (UserInfo->ProfilePath.Length > 0)
- {
- UserInfo4->usri4_profile = Ptr;
+ UserInfo4->usri4_profile = Ptr;
+ memcpy(UserInfo4->usri4_profile,
+ UserInfo->ProfilePath.Buffer,
+ UserInfo->ProfilePath.Length);
+ UserInfo4->usri4_profile[UserInfo->ProfilePath.Length / sizeof(WCHAR)] = UNICODE_NULL;
+ Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->ProfilePath.Length + sizeof(WCHAR));
- memcpy(UserInfo4->usri4_profile,
- UserInfo->ProfilePath.Buffer,
- UserInfo->ProfilePath.Length);
- UserInfo4->usri4_profile[UserInfo->ProfilePath.Length / sizeof(WCHAR)] = UNICODE_NULL;
-
- Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->ProfilePath.Length + sizeof(WCHAR));
- }
-
- if (UserInfo->HomeDirectoryDrive.Length > 0)
- {
- UserInfo4->usri4_home_dir_drive = Ptr;
-
- memcpy(UserInfo4->usri4_home_dir_drive,
- UserInfo->HomeDirectoryDrive.Buffer,
- UserInfo->HomeDirectoryDrive.Length);
- UserInfo4->usri4_home_dir_drive[UserInfo->HomeDirectoryDrive.Length / sizeof(WCHAR)] = UNICODE_NULL;
-
- Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->HomeDirectoryDrive.Length + sizeof(WCHAR));
- }
+ UserInfo4->usri4_home_dir_drive = Ptr;
+ memcpy(UserInfo4->usri4_home_dir_drive,
+ UserInfo->HomeDirectoryDrive.Buffer,
+ UserInfo->HomeDirectoryDrive.Length);
+ UserInfo4->usri4_home_dir_drive[UserInfo->HomeDirectoryDrive.Length / sizeof(WCHAR)] = UNICODE_NULL;
+ Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->HomeDirectoryDrive.Length + sizeof(WCHAR));
UserInfo4->usri4_password_expired = (UserInfo->UserAccountControl & USER_PASSWORD_EXPIRED);
break;
Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->UserName.Length + sizeof(WCHAR));
- if (UserInfo->AdminComment.Length > 0)
- {
- UserInfo10->usri10_comment = Ptr;
-
- memcpy(UserInfo10->usri10_comment,
- UserInfo->AdminComment.Buffer,
- UserInfo->AdminComment.Length);
- UserInfo10->usri10_comment[UserInfo->AdminComment.Length / sizeof(WCHAR)] = UNICODE_NULL;
-
- Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->AdminComment.Length + sizeof(WCHAR));
- }
-
- if (UserInfo->UserComment.Length > 0)
- {
- UserInfo10->usri10_usr_comment = Ptr;
-
- memcpy(UserInfo10->usri10_usr_comment,
- UserInfo->UserComment.Buffer,
- UserInfo->UserComment.Length);
- UserInfo10->usri10_usr_comment[UserInfo->UserComment.Length / sizeof(WCHAR)] = UNICODE_NULL;
-
- Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->UserComment.Length + sizeof(WCHAR));
- }
-
- if (UserInfo->FullName.Length > 0)
- {
- UserInfo10->usri10_full_name = Ptr;
-
- memcpy(UserInfo10->usri10_full_name,
- UserInfo->FullName.Buffer,
- UserInfo->FullName.Length);
- UserInfo10->usri10_full_name[UserInfo->FullName.Length / sizeof(WCHAR)] = UNICODE_NULL;
-
- Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->FullName.Length + sizeof(WCHAR));
- }
+ UserInfo10->usri10_comment = Ptr;
+ memcpy(UserInfo10->usri10_comment,
+ UserInfo->AdminComment.Buffer,
+ UserInfo->AdminComment.Length);
+ UserInfo10->usri10_comment[UserInfo->AdminComment.Length / sizeof(WCHAR)] = UNICODE_NULL;
+ Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->AdminComment.Length + sizeof(WCHAR));
+
+ UserInfo10->usri10_usr_comment = Ptr;
+ memcpy(UserInfo10->usri10_usr_comment,
+ UserInfo->UserComment.Buffer,
+ UserInfo->UserComment.Length);
+ UserInfo10->usri10_usr_comment[UserInfo->UserComment.Length / sizeof(WCHAR)] = UNICODE_NULL;
+ Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->UserComment.Length + sizeof(WCHAR));
+
+ UserInfo10->usri10_full_name = Ptr;
+ memcpy(UserInfo10->usri10_full_name,
+ UserInfo->FullName.Buffer,
+ UserInfo->FullName.Length);
+ UserInfo10->usri10_full_name[UserInfo->FullName.Length / sizeof(WCHAR)] = UNICODE_NULL;
break;
case 11:
Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->UserName.Length + sizeof(WCHAR));
- if (UserInfo->AdminComment.Length > 0)
- {
- UserInfo11->usri11_comment = Ptr;
-
- memcpy(UserInfo11->usri11_comment,
- UserInfo->AdminComment.Buffer,
- UserInfo->AdminComment.Length);
- UserInfo11->usri11_comment[UserInfo->AdminComment.Length / sizeof(WCHAR)] = UNICODE_NULL;
-
- Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->AdminComment.Length + sizeof(WCHAR));
- }
-
- if (UserInfo->UserComment.Length > 0)
- {
- UserInfo11->usri11_usr_comment = Ptr;
-
- memcpy(UserInfo11->usri11_usr_comment,
- UserInfo->UserComment.Buffer,
- UserInfo->UserComment.Length);
- UserInfo11->usri11_usr_comment[UserInfo->UserComment.Length / sizeof(WCHAR)] = UNICODE_NULL;
-
- Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->UserComment.Length + sizeof(WCHAR));
- }
-
- if (UserInfo->FullName.Length > 0)
- {
- UserInfo11->usri11_full_name = Ptr;
-
- memcpy(UserInfo11->usri11_full_name,
- UserInfo->FullName.Buffer,
- UserInfo->FullName.Length);
- UserInfo11->usri11_full_name[UserInfo->FullName.Length / sizeof(WCHAR)] = UNICODE_NULL;
-
- Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->FullName.Length + sizeof(WCHAR));
- }
+ UserInfo11->usri11_comment = Ptr;
+ memcpy(UserInfo11->usri11_comment,
+ UserInfo->AdminComment.Buffer,
+ UserInfo->AdminComment.Length);
+ UserInfo11->usri11_comment[UserInfo->AdminComment.Length / sizeof(WCHAR)] = UNICODE_NULL;
+ Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->AdminComment.Length + sizeof(WCHAR));
+
+ UserInfo11->usri11_usr_comment = Ptr;
+ memcpy(UserInfo11->usri11_usr_comment,
+ UserInfo->UserComment.Buffer,
+ UserInfo->UserComment.Length);
+ UserInfo11->usri11_usr_comment[UserInfo->UserComment.Length / sizeof(WCHAR)] = UNICODE_NULL;
+ Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->UserComment.Length + sizeof(WCHAR));
+
+ UserInfo11->usri11_full_name = Ptr;
+ memcpy(UserInfo11->usri11_full_name,
+ UserInfo->FullName.Buffer,
+ UserInfo->FullName.Length);
+ UserInfo11->usri11_full_name[UserInfo->FullName.Length / sizeof(WCHAR)] = UNICODE_NULL;
+ Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->FullName.Length + sizeof(WCHAR));
/* FIXME: usri11_priv */
/* FIXME: usri11_auth_flags */
UserInfo11->usri11_password_age = GetPasswordAge(&UserInfo->PasswordLastSet);
- if (UserInfo->HomeDirectory.Length > 0)
- {
- UserInfo11->usri11_home_dir = Ptr;
-
- memcpy(UserInfo11->usri11_home_dir,
- UserInfo->HomeDirectory.Buffer,
- UserInfo->HomeDirectory.Length);
- UserInfo11->usri11_home_dir[UserInfo->HomeDirectory.Length / sizeof(WCHAR)] = UNICODE_NULL;
-
- Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->HomeDirectory.Length + sizeof(WCHAR));
- }
-
- if (UserInfo->Parameters.Length > 0)
- {
- UserInfo11->usri11_parms = Ptr;
-
- memcpy(UserInfo11->usri11_parms,
- UserInfo->Parameters.Buffer,
- UserInfo->Parameters.Length);
- UserInfo11->usri11_parms[UserInfo->Parameters.Length / sizeof(WCHAR)] = UNICODE_NULL;
+ UserInfo11->usri11_home_dir = Ptr;
+ memcpy(UserInfo11->usri11_home_dir,
+ UserInfo->HomeDirectory.Buffer,
+ UserInfo->HomeDirectory.Length);
+ UserInfo11->usri11_home_dir[UserInfo->HomeDirectory.Length / sizeof(WCHAR)] = UNICODE_NULL;
+ Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->HomeDirectory.Length + sizeof(WCHAR));
- Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->Parameters.Length + sizeof(WCHAR));
- }
+ UserInfo11->usri11_parms = Ptr;
+ memcpy(UserInfo11->usri11_parms,
+ UserInfo->Parameters.Buffer,
+ UserInfo->Parameters.Length);
+ UserInfo11->usri11_parms[UserInfo->Parameters.Length / sizeof(WCHAR)] = UNICODE_NULL;
+ Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->Parameters.Length + sizeof(WCHAR));
RtlTimeToSecondsSince1970(&UserInfo->LastLogon,
&UserInfo11->usri11_last_logon);
UserInfo11->usri11_bad_pw_count = UserInfo->BadPasswordCount;
UserInfo11->usri11_num_logons = UserInfo->LogonCount;
- if (LogonServer.Length > 0)
- {
- UserInfo11->usri11_logon_server = Ptr;
-
- memcpy(UserInfo11->usri11_logon_server,
- LogonServer.Buffer,
- LogonServer.Length);
- UserInfo11->usri11_logon_server[LogonServer.Length / sizeof(WCHAR)] = UNICODE_NULL;
-
- Ptr = (LPWSTR)((ULONG_PTR)Ptr + LogonServer.Length + sizeof(WCHAR));
- }
+ UserInfo11->usri11_logon_server = Ptr;
+ memcpy(UserInfo11->usri11_logon_server,
+ LogonServer.Buffer,
+ LogonServer.Length);
+ UserInfo11->usri11_logon_server[LogonServer.Length / sizeof(WCHAR)] = UNICODE_NULL;
+ Ptr = (LPWSTR)((ULONG_PTR)Ptr + LogonServer.Length + sizeof(WCHAR));
UserInfo11->usri11_country_code = UserInfo->CountryCode;
- if (UserInfo->WorkStations.Length > 0)
- {
- UserInfo11->usri11_workstations = Ptr;
-
- memcpy(UserInfo11->usri11_workstations,
- UserInfo->WorkStations.Buffer,
- UserInfo->WorkStations.Length);
- UserInfo11->usri11_workstations[UserInfo->WorkStations.Length / sizeof(WCHAR)] = UNICODE_NULL;
-
- Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->WorkStations.Length + sizeof(WCHAR));
- }
+ UserInfo11->usri11_workstations = Ptr;
+ memcpy(UserInfo11->usri11_workstations,
+ UserInfo->WorkStations.Buffer,
+ UserInfo->WorkStations.Length);
+ UserInfo11->usri11_workstations[UserInfo->WorkStations.Length / sizeof(WCHAR)] = UNICODE_NULL;
+ Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->WorkStations.Length + sizeof(WCHAR));
UserInfo11->usri11_max_storage = USER_MAXSTORAGE_UNLIMITED;
UserInfo11->usri11_units_per_week = UserInfo->LogonHours.UnitsPerWeek;
Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->UserName.Length + sizeof(WCHAR));
- if (UserInfo->FullName.Length > 0)
- {
- UserInfo20->usri20_full_name = Ptr;
+ UserInfo20->usri20_full_name = Ptr;
+ memcpy(UserInfo20->usri20_full_name,
+ UserInfo->FullName.Buffer,
+ UserInfo->FullName.Length);
+ UserInfo20->usri20_full_name[UserInfo->FullName.Length / sizeof(WCHAR)] = UNICODE_NULL;
+ Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->FullName.Length + sizeof(WCHAR));
- memcpy(UserInfo20->usri20_full_name,
- UserInfo->FullName.Buffer,
- UserInfo->FullName.Length);
- UserInfo20->usri20_full_name[UserInfo->FullName.Length / sizeof(WCHAR)] = UNICODE_NULL;
+ UserInfo20->usri20_comment = Ptr;
+ memcpy(UserInfo20->usri20_comment,
+ UserInfo->AdminComment.Buffer,
+ UserInfo->AdminComment.Length);
+ UserInfo20->usri20_comment[UserInfo->AdminComment.Length / sizeof(WCHAR)] = UNICODE_NULL;
+ Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->AdminComment.Length + sizeof(WCHAR));
- Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->FullName.Length + sizeof(WCHAR));
- }
-
- if (UserInfo->AdminComment.Length > 0)
- {
- UserInfo20->usri20_comment = Ptr;
-
- memcpy(UserInfo20->usri20_comment,
- UserInfo->AdminComment.Buffer,
- UserInfo->AdminComment.Length);
- UserInfo20->usri20_comment[UserInfo->AdminComment.Length / sizeof(WCHAR)] = UNICODE_NULL;
-
- Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->AdminComment.Length + sizeof(WCHAR));
- }
-
- UserInfo20->usri20_flags = GetAccountFlags(UserInfo->UserAccountControl);
+ UserInfo20->usri20_flags = GetAccountFlags(UserInfo->UserAccountControl,
+ Dacl);
UserInfo20->usri20_user_id = RelativeId;
break;
Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->UserName.Length + sizeof(WCHAR));
- if (UserInfo->FullName.Length > 0)
- {
- UserInfo23->usri23_full_name = Ptr;
-
- memcpy(UserInfo23->usri23_full_name,
- UserInfo->FullName.Buffer,
- UserInfo->FullName.Length);
- UserInfo23->usri23_full_name[UserInfo->FullName.Length / sizeof(WCHAR)] = UNICODE_NULL;
+ UserInfo23->usri23_full_name = Ptr;
+ memcpy(UserInfo23->usri23_full_name,
+ UserInfo->FullName.Buffer,
+ UserInfo->FullName.Length);
+ UserInfo23->usri23_full_name[UserInfo->FullName.Length / sizeof(WCHAR)] = UNICODE_NULL;
+ Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->FullName.Length + sizeof(WCHAR));
- Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->FullName.Length + sizeof(WCHAR));
- }
-
- if (UserInfo->AdminComment.Length > 0)
- {
- UserInfo23->usri23_comment = Ptr;
-
- memcpy(UserInfo23->usri23_comment,
- UserInfo->AdminComment.Buffer,
- UserInfo->AdminComment.Length);
- UserInfo23->usri23_comment[UserInfo->AdminComment.Length / sizeof(WCHAR)] = UNICODE_NULL;
-
- Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->AdminComment.Length + sizeof(WCHAR));
- }
+ UserInfo23->usri23_comment = Ptr;
+ memcpy(UserInfo23->usri23_comment,
+ UserInfo->AdminComment.Buffer,
+ UserInfo->AdminComment.Length);
+ UserInfo23->usri23_comment[UserInfo->AdminComment.Length / sizeof(WCHAR)] = UNICODE_NULL;
+ Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->AdminComment.Length + sizeof(WCHAR));
- UserInfo23->usri23_flags = GetAccountFlags(UserInfo->UserAccountControl);
+ UserInfo23->usri23_flags = GetAccountFlags(UserInfo->UserAccountControl,
+ Dacl);
/* FIXME: usri23_user_sid */
- break;
+ break;
}
done:
if (UserInfo != NULL)
FreeUserInfo(UserInfo);
+ if (Dacl != NULL)
+ HeapFree(GetProcessHeap(), 0, Dacl);
+
if (ApiStatus == NERR_Success)
{
*Buffer = LocalBuffer;
PUSER_INFO_2 UserInfo2;
PUSER_INFO_3 UserInfo3;
PUSER_INFO_4 UserInfo4;
+ PUSER_INFO_22 UserInfo22;
PUSER_INFO_1003 UserInfo1003;
PUSER_INFO_1006 UserInfo1006;
PUSER_INFO_1007 UserInfo1007;
PUSER_INFO_1051 UserInfo1051;
PUSER_INFO_1052 UserInfo1052;
PUSER_INFO_1053 UserInfo1053;
+ PACL Dacl = NULL;
NET_API_STATUS ApiStatus = NERR_Success;
NTSTATUS Status = STATUS_SUCCESS;
ZeroMemory(&UserAllInfo, sizeof(USER_ALL_INFORMATION));
+ if ((Level == 1) || (Level == 2) || (Level == 3) ||
+ (Level == 4) || (Level == 22) || (Level == 1008))
+ {
+ ApiStatus = GetUserDacl(UserHandle, &Dacl);
+ if (ApiStatus != NERR_Success)
+ goto done;
+ }
+
switch (Level)
{
case 0:
UserAllInfo.WhichFields |= USER_ALL_ADMINCOMMENT;
}
+ ChangeUserDacl(Dacl, UserInfo1->usri1_flags);
UserAllInfo.UserAccountControl = GetAccountControl(UserInfo1->usri1_flags);
UserAllInfo.WhichFields |= USER_ALL_USERACCOUNTCONTROL;
UserAllInfo.WhichFields |= USER_ALL_ADMINCOMMENT;
}
+ ChangeUserDacl(Dacl, UserInfo2->usri2_flags);
UserAllInfo.UserAccountControl = GetAccountControl(UserInfo2->usri2_flags);
UserAllInfo.WhichFields |= USER_ALL_USERACCOUNTCONTROL;
UserAllInfo.WhichFields |= USER_ALL_ADMINCOMMENT;
}
+ ChangeUserDacl(Dacl, UserInfo3->usri3_flags);
UserAllInfo.UserAccountControl = GetAccountControl(UserInfo3->usri3_flags);
UserAllInfo.WhichFields |= USER_ALL_USERACCOUNTCONTROL;
UserAllInfo.WhichFields |= USER_ALL_ADMINCOMMENT;
}
+ ChangeUserDacl(Dacl, UserInfo4->usri4_flags);
UserAllInfo.UserAccountControl = GetAccountControl(UserInfo4->usri4_flags);
UserAllInfo.WhichFields |= USER_ALL_USERACCOUNTCONTROL;
// usri4_max_storage ignored
-// UserInfo3->usri4_units_per_week;
-// UserInfo3->usri4_logon_hours;
+// UserInfo4->usri4_units_per_week;
+// UserInfo4->usri4_logon_hours;
// usri4_bad_pw_count ignored
// usri4_num_logons ignored
break;
// case 21:
-// case 22:
+// break;
+
+ case 22:
+ UserInfo22 = (PUSER_INFO_22)UserInfo;
+
+ // usri22_name ignored
+
+// UserInfo22->usri22_password[ENCRYPTED_PWLEN];
+
+ // usri22_password_age ignored
+
+// UserInfo3->usri3_priv;
+
+ if (UserInfo22->usri22_home_dir != NULL)
+ {
+ RtlInitUnicodeString(&UserAllInfo.HomeDirectory,
+ UserInfo22->usri22_home_dir);
+ UserAllInfo.WhichFields |= USER_ALL_HOMEDIRECTORY;
+ }
+
+ if (UserInfo22->usri22_comment != NULL)
+ {
+ RtlInitUnicodeString(&UserAllInfo.AdminComment,
+ UserInfo22->usri22_comment);
+ UserAllInfo.WhichFields |= USER_ALL_ADMINCOMMENT;
+ }
+
+ ChangeUserDacl(Dacl, UserInfo22->usri22_flags);
+ UserAllInfo.UserAccountControl = GetAccountControl(UserInfo22->usri22_flags);
+ UserAllInfo.WhichFields |= USER_ALL_USERACCOUNTCONTROL;
+
+ if (UserInfo22->usri22_script_path != NULL)
+ {
+ RtlInitUnicodeString(&UserAllInfo.ScriptPath,
+ UserInfo22->usri22_script_path);
+ UserAllInfo.WhichFields |= USER_ALL_SCRIPTPATH;
+ }
+
+// UserInfo22->usri22_auth_flags;
+
+ if (UserInfo22->usri22_full_name != NULL)
+ {
+ RtlInitUnicodeString(&UserAllInfo.FullName,
+ UserInfo22->usri22_full_name);
+ UserAllInfo.WhichFields |= USER_ALL_FULLNAME;
+ }
+
+ if (UserInfo22->usri22_usr_comment != NULL)
+ {
+ RtlInitUnicodeString(&UserAllInfo.UserComment,
+ UserInfo22->usri22_usr_comment);
+ UserAllInfo.WhichFields |= USER_ALL_USERCOMMENT;
+ }
+
+ if (UserInfo22->usri22_parms != NULL)
+ {
+ RtlInitUnicodeString(&UserAllInfo.Parameters,
+ UserInfo22->usri22_parms);
+ UserAllInfo.WhichFields |= USER_ALL_PARAMETERS;
+ }
+
+ if (UserInfo22->usri22_workstations != NULL)
+ {
+ RtlInitUnicodeString(&UserAllInfo.WorkStations,
+ UserInfo22->usri22_workstations);
+ UserAllInfo.WhichFields |= USER_ALL_WORKSTATIONS;
+ }
+
+ // usri22_last_logon ignored
+ // usri22_last_logoff ignored
+
+ if (UserInfo22->usri22_acct_expires == TIMEQ_FOREVER)
+ {
+ UserAllInfo.AccountExpires.LowPart = 0;
+ UserAllInfo.AccountExpires.HighPart = 0;
+ }
+ else
+ {
+ RtlSecondsSince1970ToTime(UserInfo22->usri22_acct_expires,
+ &UserAllInfo.AccountExpires);
+ }
+ UserAllInfo.WhichFields |= USER_ALL_ACCOUNTEXPIRES;
+
+ // usri22_max_storage ignored
+
+// UserInfo22->usri22_units_per_week;
+// UserInfo22->usri22_logon_hours;
+
+ // usri22_bad_pw_count ignored
+ // usri22_num_logons ignored
+ // usri22_logon_server ignored
+
+ UserAllInfo.CountryCode = UserInfo22->usri22_country_code;
+ UserAllInfo.WhichFields |= USER_ALL_COUNTRYCODE;
+
+ UserAllInfo.CodePage = UserInfo22->usri22_code_page;
+ UserAllInfo.WhichFields |= USER_ALL_CODEPAGE;
+ break;
case 1003:
UserInfo1003 = (PUSER_INFO_1003)UserInfo;
break;
// case 1005:
+// break;
case 1006:
UserInfo1006 = (PUSER_INFO_1006)UserInfo;
case 1008:
UserInfo1008 = (PUSER_INFO_1008)UserInfo;
+ ChangeUserDacl(Dacl, UserInfo1008->usri1008_flags);
UserAllInfo.UserAccountControl = GetAccountControl(UserInfo1008->usri1008_flags);
UserAllInfo.WhichFields |= USER_ALL_USERACCOUNTCONTROL;
break;
break;
// case 1010:
+// break;
case 1011:
UserInfo1011 = (PUSER_INFO_1011)UserInfo;
break;
// case 1020:
+// break;
case 1024:
UserInfo1024 = (PUSER_INFO_1024)UserInfo;
}
done:
+ if (Dacl != NULL)
+ HeapFree(GetProcessHeap(), 0, Dacl);
+
return ApiStatus;
}
TRACE("RID: %lu\n", CurrentUser->RelativeId);
Status = SamOpenUser(EnumContext->AccountDomainHandle, //BuiltinDomainHandle,
- USER_READ_GENERAL | USER_READ_PREFERENCES | USER_READ_LOGON | USER_READ_ACCOUNT,
+ READ_CONTROL | USER_READ_GENERAL | USER_READ_PREFERENCES | USER_READ_LOGON | USER_READ_ACCOUNT,
CurrentUser->RelativeId,
&UserHandle);
if (!NT_SUCCESS(Status))
// *bufptr = (LPBYTE)Buffer;
return ApiStatus;
-
-#if 0
- *bufptr = NULL;
- *entriesread = 0;
- *totalentries = 0;
-
- return ERROR_INVALID_LEVEL;
-#endif
}
/* Open the user object */
Status = SamOpenUser(AccountDomainHandle,
- USER_READ_GENERAL | USER_READ_PREFERENCES | USER_READ_LOGON | USER_READ_ACCOUNT,
+ READ_CONTROL | USER_READ_GENERAL | USER_READ_PREFERENCES | USER_READ_LOGON | USER_READ_ACCOUNT,
RelativeIds[0],
&UserHandle);
if (!NT_SUCCESS(Status))
umi0 = (PUSER_MODALS_INFO_0)*bufptr;
umi0->usrmod0_min_passwd_len = PasswordInfo->MinPasswordLength;
- umi0->usrmod0_max_passwd_age = (ULONG)(PasswordInfo->MaxPasswordAge.QuadPart / 10000000);
+ umi0->usrmod0_max_passwd_age = (ULONG)(-PasswordInfo->MaxPasswordAge.QuadPart / 10000000);
umi0->usrmod0_min_passwd_age =
DeltaTimeToSeconds(PasswordInfo->MinPasswordAge);
umi0->usrmod0_force_logoff =
switch (ServerRoleInfo->DomainServerRole)
{
-
- umi1->usrmod1_role = UAS_ROLE_STANDALONE;
- umi1->usrmod1_role = UAS_ROLE_MEMBER;
-
case DomainServerRolePrimary:
umi1->usrmod1_role = UAS_ROLE_PRIMARY;
break;
case 1:
case 2:
case 3:
-// case 4:
+ case 4:
// case 21:
-// case 22:
+ case 22:
case 1003:
// case 1005:
case 1006:
case 1012:
case 1013:
case 1014:
-// case 1017:
-// case 1018:
+ case 1017:
+ case 1018:
// case 1020:
case 1024:
case 1025: