PTOKEN_GROUPS LocalGroups = NULL;
ULONG SidHeaderLength = 0;
PSID SidHeader = NULL;
- PSID Sid;
+ PSID SrcSid, DstSid;
ULONG SidLength;
- ULONG CopiedSids = 0;
+ ULONG AllocatedSids = 0;
ULONG i;
NTSTATUS Status;
for (i = 0; i < ClientGroupsCount; i++)
{
+ SrcSid = LocalGroups->Groups[i].Sid;
+
Status = NtReadVirtualMemory(LogonContext->ClientProcessHandle,
- LocalGroups->Groups[i].Sid,
+ SrcSid,
SidHeader,
SidHeaderLength,
NULL);
SidLength = RtlLengthSid(SidHeader);
TRACE("Sid %lu: Length %lu\n", i, SidLength);
- Sid = RtlAllocateHeap(RtlGetProcessHeap(),
- HEAP_ZERO_MEMORY,
- SidLength);
- if (SidHeader == NULL)
+ DstSid = RtlAllocateHeap(RtlGetProcessHeap(),
+ HEAP_ZERO_MEMORY,
+ SidLength);
+ if (DstSid == NULL)
{
Status = STATUS_INSUFFICIENT_RESOURCES;
goto done;
}
Status = NtReadVirtualMemory(LogonContext->ClientProcessHandle,
- LocalGroups->Groups[i].Sid,
- Sid,
+ SrcSid,
+ DstSid,
SidLength,
NULL);
if (!NT_SUCCESS(Status))
{
- RtlFreeHeap(RtlGetProcessHeap(), 0, Sid);
+ RtlFreeHeap(RtlGetProcessHeap(), 0, DstSid);
goto done;
}
- LocalGroups->Groups[i].Sid = Sid;
- CopiedSids++;
+ LocalGroups->Groups[i].Sid = DstSid;
+ AllocatedSids++;
}
*TokenGroups = LocalGroups;
{
if (LocalGroups != NULL)
{
- for (i = 0; i < CopiedSids; i++)
+ for (i = 0; i < AllocatedSids; i++)
RtlFreeHeap(RtlGetProcessHeap(), 0, LocalGroups->Groups[i].Sid);
RtlFreeHeap(RtlGetProcessHeap(), 0, LocalGroups);
}
+static
+NTSTATUS
+LsapAddTokenDefaultDacl(
+ IN PVOID TokenInformation,
+ IN LSA_TOKEN_INFORMATION_TYPE TokenInformationType)
+{
+ PLSA_TOKEN_INFORMATION_V1 TokenInfo1;
+ PACL Dacl = NULL;
+ ULONG Length;
+
+ if (TokenInformationType == LsaTokenInformationV1)
+ {
+ TokenInfo1 = (PLSA_TOKEN_INFORMATION_V1)TokenInformation;
+
+ if (TokenInfo1->DefaultDacl.DefaultDacl != NULL)
+ return STATUS_SUCCESS;
+
+ Length = sizeof(ACL) +
+ (2 * sizeof(ACCESS_ALLOWED_ACE)) +
+ RtlLengthSid(TokenInfo1->Owner.Owner) +
+ RtlLengthSid(LsapLocalSystemSid);
+
+ Dacl = DispatchTable.AllocateLsaHeap(Length);
+ if (Dacl == NULL)
+ return STATUS_INSUFFICIENT_RESOURCES;
+
+ RtlCreateAcl(Dacl, Length, ACL_REVISION);
+
+ RtlAddAccessAllowedAce(Dacl,
+ ACL_REVISION,
+ GENERIC_ALL,
+ TokenInfo1->Owner.Owner);
+
+ /* SID: S-1-5-18 */
+ RtlAddAccessAllowedAce(Dacl,
+ ACL_REVISION,
+ GENERIC_ALL,
+ LsapLocalSystemSid);
+
+ TokenInfo1->DefaultDacl.DefaultDacl = Dacl;
+ }
+
+ return STATUS_SUCCESS;
+}
+
+
NTSTATUS
LsapLogonUser(PLSA_API_MSG RequestMsg,
PLSAP_LOGON_CONTEXT LogonContext)
Package = LsapGetAuthenticationPackage(PackageId);
if (Package == NULL)
{
- TRACE("LsapGetAuthenticationPackage() failed to find a package\n");
+ ERR("LsapGetAuthenticationPackage() failed to find a package\n");
return STATUS_NO_SUCH_PACKAGE;
}
RequestMsg->LogonUser.Request.AuthenticationInformationLength);
if (LocalAuthInfo == NULL)
{
- TRACE("RtlAllocateHeap() failed\n");
+ ERR("RtlAllocateHeap() failed\n");
return STATUS_INSUFFICIENT_RESOURCES;
}
NULL);
if (!NT_SUCCESS(Status))
{
- TRACE("NtReadVirtualMemory() failed (Status 0x%08lx)\n", Status);
+ ERR("NtReadVirtualMemory() failed (Status 0x%08lx)\n", Status);
RtlFreeHeap(RtlGetProcessHeap(), 0, LocalAuthInfo);
return Status;
}
RequestMsg->LogonUser.Request.LocalGroupsCount,
&LocalGroups);
if (!NT_SUCCESS(Status))
+ {
+ ERR("LsapCopyLocalGroups failed (Status 0x%08lx)\n", Status);
goto done;
+ }
TRACE("GroupCount: %lu\n", LocalGroups->GroupCount);
}
if (!NT_SUCCESS(Status))
{
- TRACE("LsaApLogonUser/Ex/2 failed (Status 0x%08lx)\n", Status);
+ ERR("LsaApLogonUser/Ex/2 failed (Status 0x%08lx)\n", Status);
+ goto done;
+ }
+
+
+ Status = LsapAddTokenDefaultDacl(TokenInformation,
+ TokenInformationType);
+ if (!NT_SUCCESS(Status))
+ {
+ ERR("LsapAddTokenDefaultDacl() failed (Status 0x%08lx)\n", Status);
goto done;
}
&RequestMsg->LogonUser.Request.SourceContext);
if (!NT_SUCCESS(Status))
{
- TRACE("NtCreateToken failed (Status 0x%08lx)\n", Status);
+ ERR("NtCreateToken failed (Status 0x%08lx)\n", Status);
goto done;
}
}
DUPLICATE_SAME_ACCESS | DUPLICATE_SAME_ATTRIBUTES | DUPLICATE_CLOSE_SOURCE);
if (!NT_SUCCESS(Status))
{
- TRACE("NtDuplicateObject failed (Status 0x%08lx)\n", Status);
+ ERR("NtDuplicateObject failed (Status 0x%08lx)\n", Status);
goto done;
}
Status = LsapSetLogonSessionData(&RequestMsg->LogonUser.Reply.LogonId);
if (!NT_SUCCESS(Status))
{
- TRACE("LsapSetLogonSessionData failed (Status 0x%08lx)\n", Status);
+ ERR("LsapSetLogonSessionData failed (Status 0x%08lx)\n", Status);
goto done;
}
if (LocalGroups != NULL)
{
for (i = 0; i < LocalGroups->GroupCount; i++)
- RtlFreeHeap(RtlGetProcessHeap(), 0, LocalGroups->Groups[i].Sid);
+ {
+ if (LocalGroups->Groups[i].Sid != NULL)
+ RtlFreeHeap(RtlGetProcessHeap(), 0, LocalGroups->Groups[i].Sid);
+ }
RtlFreeHeap(RtlGetProcessHeap(), 0, LocalGroups);
}
LIST_ENTRY WellKnownSidListHead;
+PSID LsapLocalSystemSid = NULL;
/* FUNCTIONS ***************************************************************/
PULONG SubAuthorities,
PWSTR AccountName,
PWSTR DomainName,
- SID_NAME_USE Use)
+ SID_NAME_USE Use,
+ PSID *SidPtr)
{
PWELL_KNOWN_SID SidEntry;
PULONG p;
InsertTailList(&WellKnownSidListHead,
&SidEntry->ListEntry);
+ if (SidPtr != NULL)
+ *SidPtr = SidEntry->Sid;
+
return TRUE;
}
NULL,
szAccountName,
szDomainName,
- SidTypeDomain);
+ SidTypeDomain,
+ NULL);
/* Null Sid */
LsapLoadString(hInstance, IDS_NULL_RID, szAccountName, 80);
SubAuthorities,
szAccountName,
L"",
- SidTypeWellKnownGroup);
+ SidTypeWellKnownGroup,
+ NULL);
/* World Sid */
LsapLoadString(hInstance, IDS_WORLD_RID, szAccountName, 80);
SubAuthorities,
szAccountName,
L"",
- SidTypeWellKnownGroup);
+ SidTypeWellKnownGroup,
+ NULL);
/* Local Sid */
LsapLoadString(hInstance, IDS_LOCAL_RID, szAccountName, 80);
SubAuthorities,
szAccountName,
L"",
- SidTypeWellKnownGroup);
+ SidTypeWellKnownGroup,
+ NULL);
/* Creator Owner Sid */
LsapLoadString(hInstance, IDS_CREATOR_OWNER_RID, szAccountName, 80);
SubAuthorities,
szAccountName,
L"",
- SidTypeWellKnownGroup);
+ SidTypeWellKnownGroup,
+ NULL);
/* Creator Group Sid */
LsapLoadString(hInstance, IDS_CREATOR_GROUP_RID, szAccountName, 80);
SubAuthorities,
szAccountName,
L"",
- SidTypeWellKnownGroup);
+ SidTypeWellKnownGroup,
+ NULL);
/* Creator Owner Server Sid */
LsapLoadString(hInstance, IDS_CREATOR_OWNER_SERVER_RID, szAccountName, 80);
SubAuthorities,
szAccountName,
L"",
- SidTypeWellKnownGroup);
+ SidTypeWellKnownGroup,
+ NULL);
/* Creator Group Server Sid */
LsapLoadString(hInstance, IDS_CREATOR_GROUP_SERVER_RID, szAccountName, 80);
SubAuthorities,
szAccountName,
L"",
- SidTypeWellKnownGroup);
+ SidTypeWellKnownGroup,
+ NULL);
/* Dialup Sid */
LsapLoadString(hInstance, IDS_DIALUP_RID, szAccountName, 80);
SubAuthorities,
szAccountName,
szDomainName,
- SidTypeWellKnownGroup);
+ SidTypeWellKnownGroup,
+ NULL);
/* Network Sid */
LsapLoadString(hInstance, IDS_DIALUP_RID, szAccountName, 80);
SubAuthorities,
szAccountName,
szDomainName,
- SidTypeWellKnownGroup);
+ SidTypeWellKnownGroup,
+ NULL);
/* Batch Sid*/
LsapLoadString(hInstance, IDS_BATCH_RID, szAccountName, 80);
SubAuthorities,
szAccountName,
szDomainName,
- SidTypeWellKnownGroup);
+ SidTypeWellKnownGroup,
+ NULL);
/* Interactive Sid */
LsapLoadString(hInstance, IDS_INTERACTIVE_RID, szAccountName, 80);
SubAuthorities,
szAccountName,
szDomainName,
- SidTypeWellKnownGroup);
+ SidTypeWellKnownGroup,
+ NULL);
/* Service Sid */
LsapLoadString(hInstance, IDS_SERVICE_RID, szAccountName, 80);
SubAuthorities,
szAccountName,
szDomainName,
- SidTypeWellKnownGroup);
+ SidTypeWellKnownGroup,
+ NULL);
/* Anonymous Logon Sid */
LsapLoadString(hInstance, IDS_ANONYMOUS_LOGON_RID, szAccountName, 80);
SubAuthorities,
szAccountName,
szDomainName,
- SidTypeWellKnownGroup);
+ SidTypeWellKnownGroup,
+ NULL);
/* Proxy Sid */
LsapLoadString(hInstance, IDS_PROXY_RID, szAccountName, 80);
SubAuthorities,
szAccountName,
szDomainName,
- SidTypeWellKnownGroup);
+ SidTypeWellKnownGroup,
+ NULL);
/* Enterprise Controllers Sid */
LsapLoadString(hInstance, IDS_ENTERPRISE_CONTROLLERS_RID, szAccountName, 80);
SubAuthorities,
szAccountName,
szDomainName,
- SidTypeWellKnownGroup);
+ SidTypeWellKnownGroup,
+ NULL);
/* Principal Self Sid */
LsapLoadString(hInstance, IDS_PRINCIPAL_SELF_RID, szAccountName, 80);
SubAuthorities,
szAccountName,
szDomainName,
- SidTypeWellKnownGroup);
+ SidTypeWellKnownGroup,
+ NULL);
/* Authenticated Users Sid */
LsapLoadString(hInstance, IDS_AUTHENTICATED_USER_RID, szAccountName, 80);
SubAuthorities,
szAccountName,
szDomainName,
- SidTypeWellKnownGroup);
+ SidTypeWellKnownGroup,
+ NULL);
/* Restricted Code Sid */
LsapLoadString(hInstance, IDS_RESTRICTED_CODE_RID, szAccountName, 80);
SubAuthorities,
szAccountName,
szDomainName,
- SidTypeWellKnownGroup);
+ SidTypeWellKnownGroup,
+ NULL);
/* Terminal Server Sid */
LsapLoadString(hInstance, IDS_TERMINAL_SERVER_RID, szAccountName, 80);
SubAuthorities,
szAccountName,
szDomainName,
- SidTypeWellKnownGroup);
+ SidTypeWellKnownGroup,
+ NULL);
/* Remote Logon Sid */
LsapLoadString(hInstance, IDS_REMOTE_LOGON_RID, szAccountName, 80);
SubAuthorities,
szAccountName,
szDomainName,
- SidTypeWellKnownGroup);
+ SidTypeWellKnownGroup,
+ NULL);
/* This Organization Sid */
LsapLoadString(hInstance, IDS_THIS_ORGANIZATION_RID, szAccountName, 80);
SubAuthorities,
szAccountName,
szDomainName,
- SidTypeWellKnownGroup);
+ SidTypeWellKnownGroup,
+ NULL);
/* Local System Sid */
LsapLoadString(hInstance, IDS_LOCAL_SYSTEM_RID, szAccountName, 80);
SubAuthorities,
szAccountName,
szDomainName,
- SidTypeWellKnownGroup);
+ SidTypeWellKnownGroup,
+ &LsapLocalSystemSid);
/* Local Service Sid */
LsapLoadString(hInstance, IDS_LOCAL_SERVICE_RID, szAccountName, 80);
SubAuthorities,
szAccountName,
szDomainName,
- SidTypeWellKnownGroup);
+ SidTypeWellKnownGroup,
+ NULL);
LsapCreateSid(&NtAuthority,
1,
SubAuthorities,
L"LOCALSERVICE",
L"NT AUTHORITY",
- SidTypeWellKnownGroup);
+ SidTypeWellKnownGroup,
+ NULL);
/* Network Service Sid */
LsapLoadString(hInstance, IDS_NETWORK_SERVICE_RID, szAccountName, 80);
SubAuthorities,
szAccountName,
szDomainName,
- SidTypeWellKnownGroup);
+ SidTypeWellKnownGroup,
+ NULL);
LsapCreateSid(&NtAuthority,
1,
SubAuthorities,
L"NETWORKSERVICE",
L"NT AUTHORITY",
- SidTypeWellKnownGroup);
+ SidTypeWellKnownGroup,
+ NULL);
/* Builtin Domain Sid */
LsapLoadString(hInstance, IDS_BUILTIN_DOMAIN_RID, szAccountName, 80);
SubAuthorities,
szAccountName,
szDomainName,
- SidTypeDomain);
+ SidTypeDomain,
+ NULL);
/* Administrators Alias Sid */
LsapLoadString(hInstance, IDS_ALIAS_RID_ADMINS, szAccountName, 80);
SubAuthorities,
szAccountName,
szDomainName,
- SidTypeAlias);
+ SidTypeAlias,
+ NULL);
/* Users Alias Sid */
LsapLoadString(hInstance, IDS_ALIAS_RID_USERS, szAccountName, 80);
SubAuthorities,
szAccountName,
szDomainName,
- SidTypeAlias);
+ SidTypeAlias,
+ NULL);
/* Guests Alias Sid */
LsapLoadString(hInstance, IDS_ALIAS_RID_GUESTS, szAccountName, 80);
SubAuthorities,
szAccountName,
szDomainName,
- SidTypeAlias);
+ SidTypeAlias,
+ NULL);
/* Power User Alias Sid */
LsapLoadString(hInstance, IDS_ALIAS_RID_POWER_USERS, szAccountName, 80);
SubAuthorities,
szAccountName,
szDomainName,
- SidTypeAlias);
+ SidTypeAlias,
+ NULL);
/* Account Operators Alias Sid */
LsapLoadString(hInstance, IDS_ALIAS_RID_ACCOUNT_OPS, szAccountName, 80);
SubAuthorities,
szAccountName,
szDomainName,
- SidTypeAlias);
+ SidTypeAlias,
+ NULL);
/* System Operators Alias Sid */
LsapLoadString(hInstance, IDS_ALIAS_RID_SYSTEM_OPS, szAccountName, 80);
SubAuthorities,
szAccountName,
szDomainName,
- SidTypeAlias);
+ SidTypeAlias,
+ NULL);
/* Print Operators Alias Sid */
LsapLoadString(hInstance, IDS_ALIAS_RID_PRINT_OPS, szAccountName, 80);
SubAuthorities,
szAccountName,
szDomainName,
- SidTypeAlias);
+ SidTypeAlias,
+ NULL);
/* Backup Operators Alias Sid */
LsapLoadString(hInstance, IDS_ALIAS_RID_BACKUP_OPS, szAccountName, 80);
SubAuthorities,
szAccountName,
szDomainName,
- SidTypeAlias);
+ SidTypeAlias,
+ NULL);
/* Replicators Alias Sid */
LsapLoadString(hInstance, IDS_ALIAS_RID_REPLICATOR, szAccountName, 80);
SubAuthorities,
szAccountName,
szDomainName,
- SidTypeAlias);
+ SidTypeAlias,
+ NULL);
/* RAS Servers Alias Sid */
LsapLoadString(hInstance, IDS_ALIAS_RID_RAS_SERVERS, szAccountName, 80);
SubAuthorities,
szAccountName,
szDomainName,
- SidTypeAlias);
+ SidTypeAlias,
+ NULL);
/* Pre-Windows 2000 Compatible Access Alias Sid */
LsapLoadString(hInstance, IDS_ALIAS_RID_PREW2KCOMPACCESS, szAccountName, 80);
SubAuthorities,
szAccountName,
szDomainName,
- SidTypeAlias);
+ SidTypeAlias,
+ NULL);
/* Remote Desktop Users Alias Sid */
LsapLoadString(hInstance, IDS_ALIAS_RID_REMOTE_DESKTOP_USERS, szAccountName, 80);
SubAuthorities,
szAccountName,
szDomainName,
- SidTypeAlias);
+ SidTypeAlias,
+ NULL);
/* Network Configuration Operators Alias Sid */
LsapLoadString(hInstance, IDS_ALIAS_RID_NETWORK_CONFIGURATION_OPS, szAccountName, 80);
SubAuthorities,
szAccountName,
szDomainName,
- SidTypeAlias);
+ SidTypeAlias,
+ NULL);
/* FIXME: Add more well known sids */