Hauptmenü

Fälschlicherweise importiere Nutzer löschen/deaktivieren/Rechte entziehen

Begonnen von mk268, 17.07.2026 11:50:35

⏪ vorheriges - nächstes ⏩

mk268

Hallo zusammen,

ich habe erst vor kurzem unser KIX-System übernommen, da die Kollegen, die das System zuvor vor wenigen Jahren aufgebaut haben, nicht mehr bei uns beschäftigt sind.
Dabei sind mir viele unschöne "Probleme" aufgefallen, die ich aktuell versuche nach und nach abzuarbeiten.

Und zwar wurde damals bei dem Einrichten des LDAP zu Kontakt Jobs kein Filter eingetragen.
D.h. es wurde über einen langen Zeitraum unsere gesamte AD importiert und allen Usern + Computerobjekten die Agent, Customer, Ticket Base Permission und weitere Rollen zugeordnet.
Der Import ist inzwischen umgebaut und importiert nur noch aktive Nutzer.
Jetzt haben wir im Prinzip tausende Agents bei uns im System, die ich gerne loswerden wollen würde. Bisher ist mir noch kein guter Gedanke gekommen, wie ich das am besten umsetze.
User löschen geht meines Wissens nach nicht, daher würde ich gerne allen Usern und Computerobjekte, die nicht in unserer Agent-AD-Gruppe sind, alle Rollen entziehen und deaktivieren.

Mein einzige Idee bisher war es einen neuen LDAP zu Kontakt Job anzulegen und den Filter entsprechend so zu setzen, dass mit IsAgent: 0 und IsCustomer 0 alle Nutzer, die nicht in der Agent-AD-Gruppe sind, die Rollen entzogen werden.
Problem: Ich müsste wieder die gesamte AD durchsuchen lassen und dabei würden auch wieder neue Objekte angelegt werden, da nur in KIX vorhandenes aktualisieren nicht möglich ist.

Vielleicht hat hier jemand eine Idee, wie ich das am simpelsten umsetzen kann.

Bonusfrage: Lassen sich Nutzer, die in der AD deaktiviert oder gelöscht wurden, automatisch in KIX deaktivieren? In KIX haben wir dadurch schon viele Leichen.

Danke & Grüße
Maik

Benedikt Geißler

Hallo Maik,

das Löschen von Usern respektive Kontakten ist aktuell nicht direkt per GUI-Aktionen vorgesehen. Je nachdem, ob sie schon mit Tickets als Bearbeiter/Verantwortlicher oder Kontakt verbunden sind oder in der Historie mal waren, gäbe es in der Datenbank Fremdschlüsselbeziehungen, die aufgrund referenzieller Integrität ein einfaches Löschen verhindern. Man müsste dann also ggf. in großem Stil Tickethistorien manipulieren, was der Revisionssicherheit widerspricht.

Noch eine kurze Erklärung zu Usern/Kontakten: an User-Objekten hängen die Berechtigungen zu Agenten- und/oder Kundenportal dran, an Kontakten die Stammdaten und Organisationszugehörigkeiten. Es kann also reine Kontakte geben oder eben User, die mit einem Kontakt-Objekt verbunden sind.

Zum Thema Kontakte löschen existieren bereits mehrere User Stories, also Featurerequests – konkret ist davon aber noch nichts eingeplant. Nach aktuellem Stand wird es in v39 zumindest eine Möglichkeit geben, mehrere Kontakte zu einem zusammenzufassen. Das kann auch schon bei der Datenbereinigung helfen.

Im Zusammenhang mit LDAP-Sync gibt es außerdem die Option, (in KIX Pro) automatisch nicht (mehr) gesyncte Kontakte/User ungültig stellen zu lassen, wenn man das Konsolenkommando Maint::Auth::Sync::Synchronize bzw. den zugehörigen Daemon-Task per SysConfig-Schlüssel Daemon::SchedulerCronTaskManager::Task###AuthSynchronize verwendet. Es gibt hierzu auch einen Abschnitt in der Doku:
https://docs.kixdesk.com/pro/de/administration/nutzerverwaltung/nutzerauthentifizierung-und--autorisierung/ldap-ad-synchronisation-mittels-job.html#UUID-b3f6c80f-b956-6f91-e69e-8becbc0e1c1d_UUID-0bb70fa3-9f40-b4ce-ec61-8f2be42030aa
Das Argument "--invalidate-unsynced" beim genannten Konsolen-Kommando sorgt dafür, dass alle Kontakte/User, die nicht Teil des LDAP-Syncs waren und die nicht auf einen regulären Ausdruck im SysConfig-Schlüssel Maint::Auth::Sync::Synchronize::Skip matchen, ungültig gesetzt werden. Wenn du also nachträglich die Filterbedingungen (entweder schon per Präzisierung des BaseDN oder per AlwaysFilter) nachschärfst, könntest du auf diese Weise schnell die ungewollten User deaktivieren.
Aber Achtung: Manuell angelegte User müsstest du in die Skip-Liste aufnehmen, ansonsten können sich diese nicht mehr anmelden.

Wenn du trotzdem bereits jetzt überflüssige User/Kontakte aus der Datenbank löschen willst, müsstest du vorsichtig vorgehen und zunächst prüfen, ob es tatsächlich keine Bezüge zu Tickets oder weiteren Objekten gibt. Hilfreich ist hier in der Postgres-Shell die Instruktion "\d", um Infos zu Schema einer Tabelle zu erhalten. Unter "Referenced by" sieht man alle Fremdschlüssel-Beziehungen in anderen Tabellen.
\d contact
[...]
Referenced by:
    TABLE "ticket" CONSTRAINT "fk_ticket_contact_id_id" FOREIGN KEY (contact_id) REFERENCES contact(id)
    TABLE "contact_organisation" CONSTRAINT "fk_contact_organisation_contact_id_id" FOREIGN KEY (contact_id) REFERENCES contact(id)


\d users
[...]
Referenced by:
    TABLE "valid" CONSTRAINT "fk_valid_create_by_id" FOREIGN KEY (create_by) REFERENCES users(id)
    TABLE "valid" CONSTRAINT "fk_valid_change_by_id" FOREIGN KEY (change_by) REFERENCES users(id)
    TABLE "users" CONSTRAINT "fk_users_change_by_id" FOREIGN KEY (change_by) REFERENCES users(id)
    TABLE "users" CONSTRAINT "fk_users_create_by_id" FOREIGN KEY (create_by) REFERENCES users(id)
    TABLE "users" CONSTRAINT "fk_users_outofoffice_substitute_id" FOREIGN KEY (outofoffice_substitute) REFERENCES users(id)
    TABLE "user_preferences" CONSTRAINT "fk_user_preferences_user_id_id" FOREIGN KEY (user_id) REFERENCES users(id)
    TABLE "user_counter" CONSTRAINT "fk_user_counter_user_id_id" FOREIGN KEY (user_id) REFERENCES users(id)
    TABLE "roles" CONSTRAINT "fk_roles_change_by_id" FOREIGN KEY (change_by) REFERENCES users(id)
    TABLE "roles" CONSTRAINT "fk_roles_create_by_id" FOREIGN KEY (create_by) REFERENCES users(id)
    TABLE "role_user" CONSTRAINT "fk_role_user_change_by_id" FOREIGN KEY (change_by) REFERENCES users(id)
    TABLE "role_user" CONSTRAINT "fk_role_user_user_id_id" FOREIGN KEY (user_id) REFERENCES users(id)
    TABLE "role_user" CONSTRAINT "fk_role_user_create_by_id" FOREIGN KEY (create_by) REFERENCES users(id)
    TABLE "permission_type" CONSTRAINT "fk_permission_type_change_by_id" FOREIGN KEY (change_by) REFERENCES users(id)
    TABLE "permission_type" CONSTRAINT "fk_permission_type_create_by_id" FOREIGN KEY (create_by) REFERENCES users(id)
    TABLE "role_permission" CONSTRAINT "fk_role_permission_change_by_id" FOREIGN KEY (change_by) REFERENCES users(id)
    TABLE "role_permission" CONSTRAINT "fk_role_permission_create_by_id" FOREIGN KEY (create_by) REFERENCES users(id)
    TABLE "system_address" CONSTRAINT "fk_system_address_change_by_id" FOREIGN KEY (change_by) REFERENCES users(id)
    TABLE "system_address" CONSTRAINT "fk_system_address_create_by_id" FOREIGN KEY (create_by) REFERENCES users(id)
    TABLE "system_maintenance" CONSTRAINT "fk_system_maintenance_create_by_id" FOREIGN KEY (create_by) REFERENCES users(id)
    TABLE "system_maintenance" CONSTRAINT "fk_system_maintenance_change_by_id" FOREIGN KEY (change_by) REFERENCES users(id)
    TABLE "follow_up_possible" CONSTRAINT "fk_follow_up_possible_create_by_id" FOREIGN KEY (create_by) REFERENCES users(id)
    TABLE "follow_up_possible" CONSTRAINT "fk_follow_up_possible_change_by_id" FOREIGN KEY (change_by) REFERENCES users(id)
    TABLE "queue" CONSTRAINT "fk_queue_change_by_id" FOREIGN KEY (change_by) REFERENCES users(id)
    TABLE "queue" CONSTRAINT "fk_queue_create_by_id" FOREIGN KEY (create_by) REFERENCES users(id)
    TABLE "ticket_priority" CONSTRAINT "fk_ticket_priority_change_by_id" FOREIGN KEY (change_by) REFERENCES users(id)
    TABLE "ticket_priority" CONSTRAINT "fk_ticket_priority_create_by_id" FOREIGN KEY (create_by) REFERENCES users(id)
    TABLE "ticket_type" CONSTRAINT "fk_ticket_type_change_by_id" FOREIGN KEY (change_by) REFERENCES users(id)
    TABLE "ticket_type" CONSTRAINT "fk_ticket_type_create_by_id" FOREIGN KEY (create_by) REFERENCES users(id)
    TABLE "ticket_lock_type" CONSTRAINT "fk_ticket_lock_type_change_by_id" FOREIGN KEY (change_by) REFERENCES users(id)
    TABLE "ticket_lock_type" CONSTRAINT "fk_ticket_lock_type_create_by_id" FOREIGN KEY (create_by) REFERENCES users(id)
    TABLE "ticket_state" CONSTRAINT "fk_ticket_state_change_by_id" FOREIGN KEY (change_by) REFERENCES users(id)
    TABLE "ticket_state" CONSTRAINT "fk_ticket_state_create_by_id" FOREIGN KEY (create_by) REFERENCES users(id)
    TABLE "ticket_state_type" CONSTRAINT "fk_ticket_state_type_change_by_id" FOREIGN KEY (change_by) REFERENCES users(id)
    TABLE "ticket_state_type" CONSTRAINT "fk_ticket_state_type_create_by_id" FOREIGN KEY (create_by) REFERENCES users(id)
    TABLE "ticket" CONSTRAINT "fk_ticket_change_by_id" FOREIGN KEY (change_by) REFERENCES users(id)
    TABLE "ticket" CONSTRAINT "fk_ticket_user_id_id" FOREIGN KEY (user_id) REFERENCES users(id)
    TABLE "ticket" CONSTRAINT "fk_ticket_responsible_user_id_id" FOREIGN KEY (responsible_user_id) REFERENCES users(id)
    TABLE "ticket" CONSTRAINT "fk_ticket_create_by_id" FOREIGN KEY (create_by) REFERENCES users(id)
    TABLE "ticket_flag" CONSTRAINT "fk_ticket_flag_create_by_id" FOREIGN KEY (create_by) REFERENCES users(id)
    TABLE "ticket_history" CONSTRAINT "fk_ticket_history_owner_id_id" FOREIGN KEY (owner_id) REFERENCES users(id)
    TABLE "ticket_history" CONSTRAINT "fk_ticket_history_create_by_id" FOREIGN KEY (create_by) REFERENCES users(id)
    TABLE "ticket_history" CONSTRAINT "fk_ticket_history_change_by_id" FOREIGN KEY (change_by) REFERENCES users(id)
    TABLE "ticket_history_type" CONSTRAINT "fk_ticket_history_type_create_by_id" FOREIGN KEY (create_by) REFERENCES users(id)
    TABLE "ticket_history_type" CONSTRAINT "fk_ticket_history_type_change_by_id" FOREIGN KEY (change_by) REFERENCES users(id)
    TABLE "watcher" CONSTRAINT "fk_watcher_change_by_id" FOREIGN KEY (change_by) REFERENCES users(id)
    TABLE "watcher" CONSTRAINT "fk_watcher_user_id_id" FOREIGN KEY (user_id) REFERENCES users(id)
    TABLE "watcher" CONSTRAINT "fk_watcher_create_by_id" FOREIGN KEY (create_by) REFERENCES users(id)
    TABLE "channel" CONSTRAINT "fk_channel_create_by_id" FOREIGN KEY (create_by) REFERENCES users(id)
    TABLE "channel" CONSTRAINT "fk_channel_change_by_id" FOREIGN KEY (change_by) REFERENCES users(id)
    TABLE "article_sender_type" CONSTRAINT "fk_article_sender_type_create_by_id" FOREIGN KEY (create_by) REFERENCES users(id)
    TABLE "article_sender_type" CONSTRAINT "fk_article_sender_type_change_by_id" FOREIGN KEY (change_by) REFERENCES users(id)
    TABLE "article_flag" CONSTRAINT "fk_article_flag_create_by_id" FOREIGN KEY (create_by) REFERENCES users(id)
    TABLE "article" CONSTRAINT "fk_article_change_by_id" FOREIGN KEY (change_by) REFERENCES users(id)
    TABLE "article" CONSTRAINT "fk_article_create_by_id" FOREIGN KEY (create_by) REFERENCES users(id)
    TABLE "article_plain" CONSTRAINT "fk_article_plain_change_by_id" FOREIGN KEY (change_by) REFERENCES users(id)
    TABLE "article_plain" CONSTRAINT "fk_article_plain_create_by_id" FOREIGN KEY (create_by) REFERENCES users(id)
    TABLE "article_attachment" CONSTRAINT "fk_article_attachment_change_by_id" FOREIGN KEY (change_by) REFERENCES users(id)
    TABLE "article_attachment" CONSTRAINT "fk_article_attachment_create_by_id" FOREIGN KEY (create_by) REFERENCES users(id)
    TABLE "time_accounting" CONSTRAINT "fk_time_accounting_change_by_id" FOREIGN KEY (change_by) REFERENCES users(id)
    TABLE "time_accounting" CONSTRAINT "fk_time_accounting_create_by_id" FOREIGN KEY (create_by) REFERENCES users(id)
    TABLE "auto_response_type" CONSTRAINT "fk_auto_response_type_change_by_id" FOREIGN KEY (change_by) REFERENCES users(id)
    TABLE "auto_response_type" CONSTRAINT "fk_auto_response_type_create_by_id" FOREIGN KEY (create_by) REFERENCES users(id)
    TABLE "auto_response" CONSTRAINT "fk_auto_response_create_by_id" FOREIGN KEY (create_by) REFERENCES users(id)
    TABLE "auto_response" CONSTRAINT "fk_auto_response_change_by_id" FOREIGN KEY (change_by) REFERENCES users(id)
    TABLE "queue_auto_response" CONSTRAINT "fk_queue_auto_response_create_by_id" FOREIGN KEY (create_by) REFERENCES users(id)
    TABLE "queue_auto_response" CONSTRAINT "fk_queue_auto_response_change_by_id" FOREIGN KEY (change_by) REFERENCES users(id)
    TABLE "contact" CONSTRAINT "fk_contact_create_by_id" FOREIGN KEY (create_by) REFERENCES users(id)
    TABLE "contact" CONSTRAINT "fk_contact_change_by_id" FOREIGN KEY (change_by) REFERENCES users(id)
    TABLE "contact" CONSTRAINT "fk_contact_user_id_id" FOREIGN KEY (user_id) REFERENCES users(id)
    TABLE "organisation" CONSTRAINT "fk_organisation_create_by_id" FOREIGN KEY (create_by) REFERENCES users(id)
    TABLE "organisation" CONSTRAINT "fk_organisation_change_by_id" FOREIGN KEY (change_by) REFERENCES users(id)
    TABLE "oauth2_profile" CONSTRAINT "fk_oauth2_profile_change_by_id" FOREIGN KEY (change_by) REFERENCES users(id)
    TABLE "oauth2_profile" CONSTRAINT "fk_oauth2_profile_create_by_id" FOREIGN KEY (create_by) REFERENCES users(id)
    TABLE "mail_account" CONSTRAINT "fk_mail_account_change_by_id" FOREIGN KEY (change_by) REFERENCES users(id)
    TABLE "mail_account" CONSTRAINT "fk_mail_account_create_by_id" FOREIGN KEY (create_by) REFERENCES users(id)
    TABLE "mail_filter" CONSTRAINT "fk_mail_filter_change_by_id" FOREIGN KEY (change_by) REFERENCES users(id)
    TABLE "mail_filter" CONSTRAINT "fk_mail_filter_create_by_id" FOREIGN KEY (create_by) REFERENCES users(id)
    TABLE "notification_event" CONSTRAINT "fk_notification_event_change_by_id" FOREIGN KEY (change_by) REFERENCES users(id)
    TABLE "notification_event" CONSTRAINT "fk_notification_event_create_by_id" FOREIGN KEY (create_by) REFERENCES users(id)
    TABLE "link_type" CONSTRAINT "fk_link_type_change_by_id" FOREIGN KEY (change_by) REFERENCES users(id)
    TABLE "link_type" CONSTRAINT "fk_link_type_create_by_id" FOREIGN KEY (create_by) REFERENCES users(id)
    TABLE "link_relation" CONSTRAINT "fk_link_relation_create_by_id" FOREIGN KEY (create_by) REFERENCES users(id)
    TABLE "system_data" CONSTRAINT "fk_system_data_change_by_id" FOREIGN KEY (change_by) REFERENCES users(id)
    TABLE "system_data" CONSTRAINT "fk_system_data_create_by_id" FOREIGN KEY (create_by) REFERENCES users(id)
    TABLE "api_webservice_config" CONSTRAINT "fk_api_webservice_config_change_by_id" FOREIGN KEY (change_by) REFERENCES users(id)
    TABLE "api_webservice_config" CONSTRAINT "fk_api_webservice_config_create_by_id" FOREIGN KEY (create_by) REFERENCES users(id)
    TABLE "api_webservice_config_history" CONSTRAINT "fk_api_webservice_config_history_create_by_id" FOREIGN KEY (create_by) REFERENCES users(id)
    TABLE "api_webservice_config_history" CONSTRAINT "fk_api_webservice_config_history_change_by_id" FOREIGN KEY (change_by) REFERENCES users(id)
    TABLE "dynamic_field" CONSTRAINT "fk_dynamic_field_create_by_id" FOREIGN KEY (create_by) REFERENCES users(id)
    TABLE "dynamic_field" CONSTRAINT "fk_dynamic_field_change_by_id" FOREIGN KEY (change_by) REFERENCES users(id)
    TABLE "faq_category" CONSTRAINT "fk_faq_category_created_by_id" FOREIGN KEY (created_by) REFERENCES users(id)
    TABLE "faq_category" CONSTRAINT "fk_faq_category_changed_by_id" FOREIGN KEY (changed_by) REFERENCES users(id)
    TABLE "faq_item" CONSTRAINT "fk_faq_item_created_by_id" FOREIGN KEY (created_by) REFERENCES users(id)
    TABLE "faq_item" CONSTRAINT "fk_faq_item_changed_by_id" FOREIGN KEY (changed_by) REFERENCES users(id)
    TABLE "faq_history" CONSTRAINT "fk_faq_history_changed_by_id" FOREIGN KEY (changed_by) REFERENCES users(id)
    TABLE "faq_history" CONSTRAINT "fk_faq_history_created_by_id" FOREIGN KEY (created_by) REFERENCES users(id)
    TABLE "faq_attachment" CONSTRAINT "fk_faq_attachment_changed_by_id" FOREIGN KEY (changed_by) REFERENCES users(id)
    TABLE "faq_attachment" CONSTRAINT "fk_faq_attachment_created_by_id" FOREIGN KEY (created_by) REFERENCES users(id)
    TABLE "general_catalog" CONSTRAINT "fk_general_catalog_change_by_id" FOREIGN KEY (change_by) REFERENCES users(id)
    TABLE "general_catalog" CONSTRAINT "fk_general_catalog_create_by_id" FOREIGN KEY (create_by) REFERENCES users(id)
    TABLE "imexport_template" CONSTRAINT "fk_imexport_template_change_by_id" FOREIGN KEY (change_by) REFERENCES users(id)
    TABLE "imexport_template" CONSTRAINT "fk_imexport_template_create_by_id" FOREIGN KEY (create_by) REFERENCES users(id)
    TABLE "imexport_template_run" CONSTRAINT "fk_imexport_template_run_create_by_id" FOREIGN KEY (create_by) REFERENCES users(id)
    TABLE "imexport_template_run_state" CONSTRAINT "fk_imexport_template_run_state_change_by_id" FOREIGN KEY (change_by) REFERENCES users(id)
    TABLE "imexport_template_run_state" CONSTRAINT "fk_imexport_template_run_state_create_by_id" FOREIGN KEY (create_by) REFERENCES users(id)
    TABLE "configitem" CONSTRAINT "fk_configitem_change_by_id" FOREIGN KEY (change_by) REFERENCES users(id)
    TABLE "configitem" CONSTRAINT "fk_configitem_create_by_id" FOREIGN KEY (create_by) REFERENCES users(id)
    TABLE "configitem_definition" CONSTRAINT "fk_configitem_definition_create_by_id" FOREIGN KEY (create_by) REFERENCES users(id)
    TABLE "configitem_version" CONSTRAINT "fk_configitem_version_create_by_id" FOREIGN KEY (create_by) REFERENCES users(id)
    TABLE "configitem_history_type" CONSTRAINT "fk_configitem_history_type_create_by_id" FOREIGN KEY (create_by) REFERENCES users(id)
    TABLE "configitem_history_type" CONSTRAINT "fk_configitem_history_type_change_by_id" FOREIGN KEY (change_by) REFERENCES users(id)
    TABLE "configitem_history" CONSTRAINT "fk_configitem_history_create_by_id" FOREIGN KEY (create_by) REFERENCES users(id)
    TABLE "attachment_directory" CONSTRAINT "fk_attachment_directory_change_by_id" FOREIGN KEY (change_by) REFERENCES users(id)
    TABLE "attachment_directory" CONSTRAINT "fk_attachment_directory_create_by_id" FOREIGN KEY (create_by) REFERENCES users(id)
    TABLE "text_module" CONSTRAINT "fk_text_module_create_by_id" FOREIGN KEY (create_by) REFERENCES users(id)
    TABLE "text_module" CONSTRAINT "fk_text_module_change_by_id" FOREIGN KEY (change_by) REFERENCES users(id)
    TABLE "object_icon" CONSTRAINT "fk_object_icon_change_by_id" FOREIGN KEY (change_by) REFERENCES users(id)
    TABLE "object_icon" CONSTRAINT "fk_object_icon_create_by_id" FOREIGN KEY (create_by) REFERENCES users(id)
    TABLE "translation_pattern" CONSTRAINT "fk_translation_pattern_change_by_id" FOREIGN KEY (change_by) REFERENCES users(id)
    TABLE "translation_pattern" CONSTRAINT "fk_translation_pattern_create_by_id" FOREIGN KEY (create_by) REFERENCES users(id)
    TABLE "translation_language" CONSTRAINT "fk_translation_language_change_by_id" FOREIGN KEY (change_by) REFERENCES users(id)
    TABLE "translation_language" CONSTRAINT "fk_translation_language_create_by_id" FOREIGN KEY (create_by) REFERENCES users(id)
    TABLE "sysconfig" CONSTRAINT "fk_sysconfig_change_by_id" FOREIGN KEY (change_by) REFERENCES users(id)
    TABLE "sysconfig" CONSTRAINT "fk_sysconfig_create_by_id" FOREIGN KEY (create_by) REFERENCES users(id)
    TABLE "job" CONSTRAINT "fk_job_change_by_id" FOREIGN KEY (change_by) REFERENCES users(id)
    TABLE "job" CONSTRAINT "fk_job_create_by_id" FOREIGN KEY (create_by) REFERENCES users(id)
    TABLE "job_run_state" CONSTRAINT "fk_job_run_state_change_by_id" FOREIGN KEY (change_by) REFERENCES users(id)
    TABLE "job_run_state" CONSTRAINT "fk_job_run_state_create_by_id" FOREIGN KEY (create_by) REFERENCES users(id)
    TABLE "job_run" CONSTRAINT "fk_job_run_create_by_id" FOREIGN KEY (create_by) REFERENCES users(id)
    TABLE "exec_plan" CONSTRAINT "fk_exec_plan_create_by_id" FOREIGN KEY (create_by) REFERENCES users(id)
    TABLE "exec_plan" CONSTRAINT "fk_exec_plan_change_by_id" FOREIGN KEY (change_by) REFERENCES users(id)
    TABLE "macro" CONSTRAINT "fk_macro_change_by_id" FOREIGN KEY (change_by) REFERENCES users(id)
    TABLE "macro" CONSTRAINT "fk_macro_create_by_id" FOREIGN KEY (create_by) REFERENCES users(id)
    TABLE "macro_action" CONSTRAINT "fk_macro_action_change_by_id" FOREIGN KEY (change_by) REFERENCES users(id)
    TABLE "macro_action" CONSTRAINT "fk_macro_action_create_by_id" FOREIGN KEY (create_by) REFERENCES users(id)
    TABLE "job_exec_plan" CONSTRAINT "fk_job_exec_plan_change_by_id" FOREIGN KEY (change_by) REFERENCES users(id)
    TABLE "job_exec_plan" CONSTRAINT "fk_job_exec_plan_create_by_id" FOREIGN KEY (create_by) REFERENCES users(id)
    TABLE "job_macro" CONSTRAINT "fk_job_macro_change_by_id" FOREIGN KEY (change_by) REFERENCES users(id)
    TABLE "job_macro" CONSTRAINT "fk_job_macro_create_by_id" FOREIGN KEY (create_by) REFERENCES users(id)
    TABLE "automation_log" CONSTRAINT "fk_automation_log_create_by_id" FOREIGN KEY (create_by) REFERENCES users(id)
    TABLE "report_definition" CONSTRAINT "fk_report_definition_change_by_id" FOREIGN KEY (change_by) REFERENCES users(id)
    TABLE "report_definition" CONSTRAINT "fk_report_definition_create_by_id" FOREIGN KEY (create_by) REFERENCES users(id)
    TABLE "report" CONSTRAINT "fk_report_create_by_id" FOREIGN KEY (create_by) REFERENCES users(id)
    TABLE "report_result" CONSTRAINT "fk_report_result_create_by_id" FOREIGN KEY (create_by) REFERENCES users(id)
    TABLE "sla" CONSTRAINT "fk_sla_change_by_id" FOREIGN KEY (change_by) REFERENCES users(id)
    TABLE "sla" CONSTRAINT "fk_sla_create_by_id" FOREIGN KEY (create_by) REFERENCES users(id)
    TABLE "ticket_sla_criterion" CONSTRAINT "fk_ticket_sla_criterion_change_by_id" FOREIGN KEY (change_by) REFERENCES users(id)
    TABLE "ticket_sla_criterion" CONSTRAINT "fk_ticket_sla_criterion_create_by_id" FOREIGN KEY (create_by) REFERENCES users(id)
    TABLE "template" CONSTRAINT "fk_template_change_by_id" FOREIGN KEY (change_by) REFERENCES users(id)
    TABLE "template" CONSTRAINT "fk_template_create_by_id" FOREIGN KEY (create_by) REFERENCES users(id)
    TABLE "object_action" CONSTRAINT "fk_object_action_change_by_id" FOREIGN KEY (change_by) REFERENCES users(id)
    TABLE "object_action" CONSTRAINT "fk_object_action_create_by_id" FOREIGN KEY (create_by) REFERENCES users(id)
    TABLE "service" CONSTRAINT "fk_service_change_by_id" FOREIGN KEY (change_by) REFERENCES users(id)
    TABLE "service" CONSTRAINT "fk_service_create_by_id" FOREIGN KEY (create_by) REFERENCES users(id)
    TABLE "service_contract" CONSTRAINT "fk_service_contract_create_by_id" FOREIGN KEY (create_by) REFERENCES users(id)
    TABLE "service_contract" CONSTRAINT "fk_service_contract_change_by_id" FOREIGN KEY (change_by) REFERENCES users(id)
    TABLE "service_contract_dependency" CONSTRAINT "fk_service_contract_dependency_create_by_id" FOREIGN KEY (create_by) REFERENCES users(id)
    TABLE "service_contract_dependency" CONSTRAINT "fk_service_contract_dependency_change_by_id" FOREIGN KEY (change_by) REFERENCES users(id)
    TABLE "news" CONSTRAINT "fk_news_change_by_id" FOREIGN KEY (change_by) REFERENCES users(id)
    TABLE "news" CONSTRAINT "fk_news_create_by_id" FOREIGN KEY (create_by) REFERENCES users(id)
    TABLE "workflow_ruleset" CONSTRAINT "fk_workflow_ruleset_change_by_id" FOREIGN KEY (change_by) REFERENCES users(id)
    TABLE "workflow_ruleset" CONSTRAINT "fk_workflow_ruleset_create_by_id" FOREIGN KEY (create_by) REFERENCES users(id)
    TABLE "object_history" CONSTRAINT "fk_object_history_change_by_id" FOREIGN KEY (change_by) REFERENCES users(id)
    TABLE "object_history" CONSTRAINT "fk_object_history_create_by_id" FOREIGN KEY (create_by) REFERENCES users(id)
    TABLE "remote_connection" CONSTRAINT "fk_remote_connection_change_by_id" FOREIGN KEY (change_by) REFERENCES users(id)
    TABLE "remote_connection" CONSTRAINT "fk_remote_connection_create_by_id" FOREIGN KEY (create_by) REFERENCES users(id)
    TABLE "datasource" CONSTRAINT "fk_datasource_change_by_id" FOREIGN KEY (change_by) REFERENCES users(id)
    TABLE "datasource" CONSTRAINT "fk_datasource_create_by_id" FOREIGN KEY (create_by) REFERENCES users(id)
    TABLE "kixmp_plan" CONSTRAINT "fk_kixmp_plan_change_by_id" FOREIGN KEY (change_by) REFERENCES users(id)
    TABLE "kixmp_plan" CONSTRAINT "fk_kixmp_plan_create_by_id" FOREIGN KEY (create_by) REFERENCES users(id)
    TABLE "kixmp_task" CONSTRAINT "fk_kixmp_task_change_by_id" FOREIGN KEY (change_by) REFERENCES users(id)
    TABLE "kixmp_task" CONSTRAINT "fk_kixmp_task_create_by_id" FOREIGN KEY (create_by) REFERENCES users(id)
    TABLE "endpoint" CONSTRAINT "fk_endpoint_change_by_id" FOREIGN KEY (change_by) REFERENCES users(id)
    TABLE "endpoint" CONSTRAINT "fk_endpoint_create_by_id" FOREIGN KEY (create_by) REFERENCES users(id)
    TABLE "object_tags" CONSTRAINT "fk_object_tags_create_by_id" FOREIGN KEY (create_by) REFERENCES users(id)
    TABLE "object_tags" CONSTRAINT "fk_object_tags_change_by_id" FOREIGN KEY (change_by) REFERENCES users(id)
    TABLE "object_action_group" CONSTRAINT "fk_object_action_group_create_by_id" FOREIGN KEY (create_by) REFERENCES users(id)
    TABLE "object_action_group" CONSTRAINT "fk_object_action_group_change_by_id" FOREIGN KEY (change_by) REFERENCES users(id)

Also gerade die User hängen potenziell an vielen verschiedenen anderen Objekten dran – deswegen wäre generell tendenziell auch vom Löschen abzuraten. Z. B. die Zeile
TABLE "ticket_history" CONSTRAINT "fk_ticket_history_create_by_id" FOREIGN KEY (create_by) REFERENCES users(id)wäre so zu intepretieren: in der Tabelle ticket_history verweist das Attribut create_by auf die Spalte id in der Tabelle users.

Um zu prüfen, ob also eine Beziehung zu mindest einem Tabellenhistorieneintrag zu einem von mehreren UserIDs besteht, könntest du abfragen:
select count(*) from ticket_history where create_by in (...) or change_by in (...) or owner_id in (...);(die drei Punkte jeweils ersetzen durch die kommaseparierte Liste von UserIDs)

Und so weiter. Bei Ausführung von DELETE-Statements prüft das DBMS auch immer, ob dadurch Fremdschlüsselverweise verletzt würden – aufgrund der großen Menge an solchen möglichen Beziehungen dauert dies gerade bei users ziemlich lang. Wenn es zu einer Integritätsverletzung käme, wirft die Datenbank eine entsprechende Fehlermeldung und verwirft den Löschversuch –  es ist ja eine Transaktion. Dann müsstest du diesem Hinweis entweder nachgehen und ggf. zunächst versuchen, das abhängige Objekt zu löschen – im Falle von Tickethistorieneinträgen würde ich davon abraten –, oder eben den User lieber bloß ungültig stellen.

Helfen dir die Hinweise erstmal so weiter?

Viele Grüße
Benedikt

mk268

Hallo Benedikt,

vielen Dank für die ausführliche Antwort!
Ich würde dann eher so wie von dir empfohlen vorgehen und die Objekte auf ungültig setzen.

In unserer Testumgebung habe ich das bereits ausprobiert und dort sieht das Ergebnis gut aus.
Ich habe dazu noch ein zwei Fragen:
Aktuell nutzen wir den Job zum syncen der Kontakte, der in der GUI bei den Automatisierungen eingerichtet werden kann. Da ich den --invalidate-unsynced Befehl sehr gut finde, um auch in der AD nicht mehr vorhandene Kontakte zu deaktivieren, würde ich gerne den CronTask einrichten. Ich denke dann macht es Sinn den Job bei den Automatisierungen zu deaktivieren, da der sync sonst immer doppelt läuft, richtig?

Die zweite Frage betrifft die --page-size. Diese liegt ja Standard bei 100. Da bekomme ich aber direkt die Meldung, dass die 100 zu klein sind.
Gibt es da einen Weg festzustellen, welche Page-Size ich verwenden sollte oder ist das try and error? Ich möchte da ungerne einfach eine zu große Zahl eintragen. Oder ist das egal?

Grüße
Maik

Benedikt Geißler

Hallo Maik,

mit dem Befehl Maint::Auth::Sync::Synchronize werden auch alle Kontakte gemäß ContactUserSync im SysConfig-Schlüssel gesynct, von daher brauchst du dann eigentlich keinen separaten Job mehr dafür, korrekt.

Die Pagesize kannst du sicherlich noch erhöhen. Dass die mit angegeben wird, hängt bloß damit zusammen, dass manche LDAP-Server ohne Paging keine Datensätze mehr herausgeben, also eben erfordern, dass man sie nur portionsweise abfragt. Welche konkrete Pagesize am besten funktioniert, müsstest du wohl per trial & error herausfinden. Laut Doku hat z. B. Microsoft in Active Directory eine standardmäßige serverseitige MaxPageSize von 1000: https://learn.microsoft.com/de-de/troubleshoot/windows-server/active-directory/view-set-ldap-policy-using-ntdsutil

Viele Grüße
Benedikt

mk268

Super, danke!
D.h. die Page-Size ist eigentlich "egal", weil das Script bei einem niedrigeren Wert einfach automatisch die Anfragen aufteilt?

Ich werde den Sync mal über Nacht mit einem höheren Timeout laufen lassen, weil es so viele Objekte sind, dass aktuell ein Gateway Timeout kommt.

Benedikt Geißler

Hallo Maik,

ja, die Page-Size besagt nur, wie groß jeweils die Päckchen sind, die der Reihe nach abgefragt werden, bis alle relevante Objekte gemäß Filter durch sind.
Bzgl. Timeout: du kannst den Konsolenbefehl auch auf dem Server direkt ausführen:
docker exec kix-backend-1 kix Maint::Auth::Sync::Synchronize --page-size 100 --invalidate-unsynced
Viele Grüße
Benedikt

mk268

Hat wunderbar funktioniert.

Eine letzte Frage noch, dann gebe ich Ruhe :)
Bei dem Sync kommt dieser eine Error:

docker exec kix-backend-1 kix Maint::Auth::Sync::Synchronize --page-size 500 --invalidate-unsynced
[Thu Aug 13 10:01:14 2026][Error][Kernel::System::Auth::Sync::LDAP::Sync][220] Can't assign user "XXXX" (CN=XXXX,OU=XXXX,OU=XXXX,OU=XXXX,DC=XXXX,DC=de) to contact (4008) in RDBMS! Contact is already assigned to user with ID (10489).
ERROR: kix.Console.pl-Maint::Auth::Sync::Synchronize-39 Perl: 5.36.0 OS: linux Time: Thu Aug 13 10:01:14 2026

 Message: Can't assign user "XXXX" (CN=XXXX,OU=XXXX,OU=XXXX,OU=XXXX,DC=XXXX,DC=de) to contact (4008) in RDBMS! Contact is already assigned to user with ID (10489).

 Traceback (31427):
   Module: Kernel::System::Auth::Sync::LDAP::Sync Line: 220
   Module: KIXPro::Kernel::System::Console::Command::Maint::Auth::Sync::Synchronize::_SyncBackend Line: 304
   Module: KIXPro::Kernel::System::Console::Command::Maint::Auth::Sync::Synchronize::Run Line: 113
   Module: (eval) Line: 456
   Module: Kernel::System::Console::BaseCommand::Execute Line: 450
   Module: Kernel::System::Console::Run Line: 88
   Module: /opt/kix/bin/kix.Console.pl Line: 29

Starting sync...
 - Begin processing sync config... Processing result entries 1 to 500...
Processing result entries 501 to 1000...
Processing result entries 1001 to 1500...
Processing result entries 1501 to 1743...
 - Done
 - Begin processing sync config... Processing result entries 1 to 16...
 - Done
Set users invalid that were not synced...
Done

Wenn ich mich richtig erinnere, wurde der dort aufgelistete User mal wegen einer Namensänderung (Zweitname) gelöscht und neu in der AD hinzugefügt. Vermutlich lief zwischendurch schon der KIX Sync. Der User ist auch noch aktiv und Agent. Login funktioniert ebenfalls.
Ist das ein ignorierbarer Fehler oder kann ich da was machen?