Set-PSUAuthenticationMethod -Type "Form" -ScriptBlock { param( [PSCredential]$Credential ) Add-Type -AssemblyName System.DirectoryServices.AccountManagement # is this a UPN? if ( $Credential.UserName.IndexOf('@') -gt -1 ) { # juggle back and forth from SID to get NTAccount format $NTAccountName = ([System.Security.Principal.NTAccount]$Credential.UserName).Translate([System.Security.Principal.SecurityIdentifier]).Translate([System.Security.Principal.NTAccount]).Value } elseif ( $Credential.UserName.IndexOf('\') -gt -1 ) { # already NTAccount format $NTAccountName = $Credential.UserName } else { # someone didn't enter their domain... $NTAccountName = "NDGOV\" + $Credential.GetNetworkCredential().UserName } # split domain and username $DomainName, $UserName = $NTAccountName.Split('\', 2) # perform auth with AD $PrincipalContext = New-Object System.DirectoryServices.AccountManagement.PrincipalContext( 'Domain', $DomainName ) $Authenticated = $PrincipalContext.ValidateCredentials( $UserName, $Credential.GetNetworkCredential().Password, 'Negotiate, Sealing' ) if ( $Authenticated ) { # discover the user principal, needed for the user DN $UserPrincipal = [System.DirectoryServices.AccountManagement.UserPrincipal]::FindByIdentity($PrincipalContext, [System.DirectoryServices.AccountManagement.IdentityType]::SamAccountName, $NTAccountName ) # get the user's domain $UserDomainContext = [System.DirectoryServices.ActiveDirectory.DirectoryContext]::new( 'Domain', $DomainName, $Credential.UserName, $Credential.GetNetworkCredential().Password ) $UserDomain = [System.DirectoryServices.ActiveDirectory.Domain]::GetDomain( $UserDomainContext ) # get the computer's domain #$ComputerDomain = [System.DirectoryServices.ActiveDirectory.Domain]::GetComputerDomain() # hold all the user groups [System.Collections.Generic.List[hashtable]]$Groups = @() # get groups from user's domain #[adsisearcher]::new( $UserDomain.GetDirectoryEntry(), "(&(objectCategory=group)(objectClass=group)(member:1.2.840.113556.1.4.1941:=$($UserPrincipal.DistinguishedName)))", @('name') ).FindAll().ForEach({ [adsisearcher]::new( $UserDomain.GetDirectoryEntry(), "(&(objectCategory=group)(objectClass=group)(member:1.2.840.113556.1.4.1941:=$($UserPrincipal.DistinguishedName))(name=ITD-PSUniversal-*))", @('name') ).FindAll().ForEach({ $Groups.Add(@{ Type = 'Group' Value = $_.Properties['name'][0] Issuer = $UserDomain.Name }) }) <# # get groups from the computer's domain (if different) if ( $UserDomain.Name -ne $ComputerDomain.Name ) { # lookup the user's foreign security principal in the computer's domain $ForeignSecurityPrincipal = [adsisearcher]::new( $ComputerDomain.GetDirectoryEntry(), "(&(objectCategory=foreignSecurityPrincipal)(objectClass=foreignSecurityPrincipal)(name=$($UserPrincipal.Sid)))", @('distinguishedName') ).FindOne().Properties['distinguishedName'][0] # find all the group memberships [adsisearcher]::new( $ComputerDomain.GetDirectoryEntry(), "(&(objectCategory=group)(objectClass=group)(member:1.2.840.113556.1.4.1941:=$ForeignSecurityPrincipal))", @('name') ).FindAll().ForEach({ $Groups.Add(@{ Type = 'Group' Value = $_.Properties['name'][0] Issuer = $ComputerDomain.Name }) }) } #> New-PSUAuthenticationResult -Success -UserName $UserPrincipal.UserPrincipalName -Claims { $Groups | ForEach-Object { New-PSUAuthorizationClaim @_ } } } else { New-PSUAuthenticationResult -ErrorMessage 'Bad username or password :)' } }