Recentemente mi sono trovato a dover gestire la sincronizzazione degli utenti di Liferay 7 con un server LDAP e durante le prove ho dovuto ripetutamente rimuovere gli utenti importati.
 Come sapete, per rimuovere un utente di Liferay bisogna prima disattivarlo e poi cancellarlo; purtroppo, quando gli utenti iniziano ad essere 5000, l'operazione potrebbe diventare un tantino tediosa se fatta dal pannello di controllo; non potevo farlo nemmeno via SQL perché avrei dovuto pulire anche tutte le tabelle collegate.
 Non avendo voglia/tempo di sviluppare un plugin ad hoc per risolvere il problema, ho provato a realizzare il tutto mediante uno script Groovy che può comodamente essere incollato ed eseguito nel pannello di controllo di Liferay.
 E' pertanto sufficiente collegarsi a Liferay ed accedere al menu Pannello di Controllo -> Configurazione -> Gestione Server e cliccare sul tab Script; dopodiché è sufficiente incollare il seguente codice Groovy ed eseguirlo.
 
import com.liferay.portal.kernel.model.User;
import com.liferay.portal.kernel.search.Document;
import com.liferay.portal.kernel.search.Hits;
import com.liferay.portal.kernel.search.Sort;
import com.liferay.portal.kernel.service.UserLocalServiceUtil;
import com.liferay.portal.kernel.util.GetterUtil;
import com.liferay.portal.kernel.workflow.WorkflowConstants;
long companyId = ...;
// Conteggio degli utenti inattivi
int number = UserLocalServiceUtil.searchCount(companyId, null, WorkflowConstants.STATUS_INACTIVE, null);
out.println("Utenti non attivi: " + number);
// Recupero degli utenti inattivi e riconteggio per verifica
Hits hits = UserLocalServiceUtil.search(companyId, null, WorkflowConstants.STATUS_INACTIVE, null, -1, -1, new Sort("userId", false));
out.println("Utenti non attivi: " + hits.getLength());
for(int i = 0; i < hits.getLength(); i++) {
    Document document = hits.doc(i);
    User user = UserLocalServiceUtil.fetchUser(GetterUtil.getLong(document.get("entryClassPK")));
    out.print("[" + (i + 1) + "/" + hits.getLength() + "] ");
    
    if(user != null) {
        out.println(user.getPrimaryKey() + " - " + user.getFullName() + " (" + user.getEmailAddress() + ")");
        // Decommentare per cancellare l'utente
        // UserLocalServiceUtil.deleteUser(user);
    } else {
        out.println("L'utente " + document.get("entryClassPK") + " non esiste!");
    }
} Lo script è concettualmente molto semplice: innanzitutto conta gli utenti inattivi in base alle informazioni presenti su Lucene e lo fa con 2 approcci diversi per sicurezza. Dopodichè cicla su ogni singolo utente, ne stampa alcuni dati e lo cancella (ovviamente dovete decommentare la riga).
 Una volta eseguito lo script, il controllo torna immediatamente al browser ma la cancellazione degli utenti procede in background; quindi commentate la riga della cancellazione e rieseguitelo più volte per seguire il procedere della cancellazione.