Not sure why you would need the sAMAccountType if you already have objectClass=user. The objectClass is already defining the type to a certain extent. If it doesn't do anything, remove it.
The main reason to use ObjectClass=User is because its an indexed field and it makes the searches much quicker when you have at least one indexed field.
sAMAccountName would only bring back one entry even if it did work.
The memberOf looks odd. What are those numbers for? 1.2.840.113556.1.4.1941
When I started with LDAP, I used Apache Directory Studio to verify searches and syntax, as it only takes one element in the wrong place to break everything.
Keep it simple to start with. Try the following.
'(&(objectClass=user)(memberOf=CN=TargetGroup,OU=Test,OU=Service,DC=domainprefix,DC=domain,DC=DomainSuffix))'
Does that work consistently? Once that works, you can add in other attributes in a controlled manner.
One other attribute for consideration is UserAccountControl
The following is a "normal" user. Enabled user with account expiry set .
UserAccountControl:1.2.840.113556.1.4.803:=2
https://social.technet.microsoft.com/wiki/contents/articles/5392.active-directory-ldap-syntax-filters.aspx
I tend to do everything with users in PowerShell now and you can test LDAP searches without having the AD CMDlets installed. For example..
$searcher=[adsisearcher] '(&(UserAccountControl:1.2.840.113556.1.4.803:=2)(memberOf=CN=groupA,OU=Test,OU=Groups,DC=xx,DC=yy,DC=zz)(objectClass=User))'
$searcher.PropertiesToLoad.AddRange(@('displayname','mail'))
$searcher.FindAll() | Select-Object @{n='displayname';e={$_.properties['displayname'][0]}},@{n='mail';e={$_.properties['mail'][0]}}