There is no need to write a custom trimmer in 2010 (i am not sure about 2013) as you can impersonate the user and query search as if you were her. Helper classes: public class WindowsImpersonation : IDisposable { public readonly bool impersonated = false; private WindowsImpersonationContext wic = null; //upn is the user account in the form of [email protected] //ntAccount is not required but is used to prevent unnecessary impersonation public WindowsImpersonation(string upn, string ntAccount = "") { //see if impersonation is required WindowsIdentity current = WindowsIdentity.GetCurrent(); if ( current != null && current.Name.Equals(ntAccount, StringComparison.OrdinalIgnoreCase) ) { return; //nope } try { // // current user account must have the following permissions: // - Act as Part of the Operating System // - Impersonate a client after authentication // // gpedit.msc -> local computer -> Windows Settings -> Security Settings -> Local Policies -> User Rights Assignment //impersonate user wic = (new WindowsIdentity(upn)).Impersonate(); impersonated = true; } catch(Exception) { Dispose(); throw; } } public void Dispose() { if (wic != null) { wic.Undo(); wic = null; } } } public static class Extensions_User_Impersonate { public static IDisposable Impersonate(this User user) { return new WindowsImpersonation(user.upn, user.ntAccount); } } Example: //elevate, impersonate and search: using (HostingEnvironment.Impersonate()){ using (user.Impersonate()) { return SP.KeywordQuery(query); } }; //or SPSecurity.RunWithElevatedPrivileges(() => { using (user.Impersonate()) { //Search code goes here } }); (some associated classes not included and some comments redacted)