cardozoaldama
Since you are starting out. Here is my suggestion. Think of this as building a small program in layers, not all at once.
First, learn what the system already provides. On GhostBSD, user accounts are managed with the pw command. You do not need to invent your own way to create or delete users. Spend time running pw useradd, pw usermod, pw userdel, and reading man pw. This teaches you what inputs are required, what can go wrong, and what a “correct” user account looks like on the system. At this stage you are not writing a GUI yet. You are just understanding the problem.
Second, separate “logic” from “interface”. The logic is “add a user”, “change a shell”, or “remove a user”. The interface is the window, buttons, and text fields. In good programs, the interface does not directly change the system. Instead, it asks the logic layer to do it. For this app, the logic layer is simply calling pw with the right arguments.
Third, introduce security boundaries. Changing users requires administrator privileges, but showing windows does not. So you create two small programs. One is the GNUstep app that runs as a normal user. It collects input, checks that it makes sense (for example, usernames are valid), and shows results. The second is a tiny helper program that runs with elevated privileges and is only responsible for executing specific pw commands. The GUI talks to the helper in a controlled way, passing structured data instead of free-form shell strings.
Finally, build the GUI using GNUstep. Start simple. One window, a form for username, UID, groups, and shell, and buttons like “Add User” or “Remove User”. When a button is clicked, your Objective-C code prepares the request and sends it to the helper. The helper runs pw, captures success or error output, and returns that to the GUI, which then displays it to the user.
If you approach it this way, you are not “writing a user manager”. You are learning how to break a real system problem into pieces: understand existing tools, model the operations, respect security boundaries, and then add a user interface on top. That skill transfers directly to almost every other system programming task you will encounter.