#### Update: GetUserName by print to stdout

Main function has been updated with `string[] args` and a new feature:
```
    if (args.length > 1 && args[1] == "print") {
                write(username);
    }
```


#### Usage:
`WindowsGetUserName.exe print`

#### Demonstration


![img1](https://i.imgur.com/dWPlo8L.png)

#### WindowsGetUserName.d
```d
import core.sys.windows.windows;
import std.conv;
import std.stdio;
import std.range;

pragma(lib, "advapi32.lib");

/**
 * Retrieves the currently logged-in user's name in a safe manner.
 *
* This function first determines the required buffer size, allocates memory for the username,
 * and then retrieves the username.
 *
 * Returns:
 *   - The username as a string if successful.
 *   - An empty string if an error occurs.
 */
string getSafeUsername() @system {
    wchar[] userName;
    DWORD userNameSize = 0;

    // First, try GetUserNameW (Unicode version)
    if (!GetUserNameW(null, &userNameSize)) {
        int error = GetLastError();
        if (error != ERROR_INSUFFICIENT_BUFFER) {
// Failed for a reason other than an insufficient buffer
            return "";
        }
    }

    // Allocate memory for userName
scope(exit) userName.length = 0; // Ensure memory is released if an exception occurs
    userName.length = userNameSize;

    // Retrieve the user name by calling GetUserNameW
    if (GetUserNameW(userName.ptr, &userNameSize)) {
// Successfully retrieved the user name, convert it to a string
        return to!string(userName);
    }

    // If GetUserNameW fails, try GetUserNameA (ANSI version)
    char[] userNameA;
    userNameSize = 0;

    if (!GetUserNameA(null, &userNameSize)) {
        int errorA = GetLastError();
        if (errorA != ERROR_INSUFFICIENT_BUFFER) {
// Failed for a reason other than an insufficient buffer
            return "";
        }
    }

    // Allocate memory for userNameA
scope(exit) userNameA.length = 0; // Ensure memory is released if an exception occurs
    userNameA.length = userNameSize;

    // Retrieve the user name by calling GetUserNameA
    if (GetUserNameA(userNameA.ptr, &userNameSize)) {
// Successfully retrieved the user name using ANSI version, convert it to a string
        return to!string(userNameA);
    }

// Both GetUserNameW and GetUserNameA failed, return an empty string
    return "";
}

/**
 * The entry point of the application.
 */
void main(string[] args) {
    string username = getSafeUsername();
    if (args.length > 1 && args[1] == "print") {
                write(username);
    } else if (!username.empty){
                writeln("Logged-in user name: ", username);

        } else {
        writeln("Failed to retrieve the user name.");
    }
}

```

Reply via email to