Freigeben über


Erstellen eines neuen Computerkontos

Im folgenden Codebeispiel wird veranschaulicht, wie Sie mithilfe der NetUserAdd-Funktion ein neues Computerkonto erstellen.

Im Folgenden werden Überlegungen zur Verwaltung von Computerkonten berücksichtigt:

  • Der Computerkontoname sollte aus Gründen der Konsistenz mit Kontoverwaltungs-Hilfsprogrammen in Großbuchstaben bestehen.
  • Ein Computerkontoname weist immer ein nachfolgendes Dollarzeichen ($) auf. Alle Funktionen zum Verwalten von Computerkonten müssen den Computernamen so erstellen, dass das letzte Zeichen des Computerkontonamens ein Dollarzeichen ($) ist. Bei interdomänenübergreifender Vertrauensstellung lautet der Kontoname TrustingDomainName$.
  • Die maximale Computernamenlänge ist MAX_COMPUTERNAME_LENGTH (15). Diese Länge enthält nicht das nachfolgende Dollarzeichen ($).
  • Das Kennwort für ein neues Computerkonto sollte die Kleinbuchstabendarstellung des Computerkontonamens ohne das nachfolgende Dollarzeichen ($) sein. Bei domänenübergreifender Vertrauensstellung kann das Kennwort ein beliebiger Wert sein, der dem wert entspricht, der auf der Vertrauensseite der Beziehung angegeben ist.
  • Die maximale Kennwortlänge ist LM20_PWLEN (14). Das Kennwort sollte auf diese Länge gekürzt werden, wenn der Name des Computerkontos diese Länge überschreitet.
  • Das zum Zeitpunkt der Computerkontoerstellung angegebene Kennwort ist nur gültig, bis das Computerkonto in der Domäne aktiv wird. Während der Aktivierung der Vertrauensstellung wird ein neues Kennwort festgelegt.
#include <windows.h>
#include <lm.h>
#pragma comment(lib, "netapi32.lib")

BOOL AddMachineAccount(
    LPWSTR wTargetComputer,
    LPWSTR MachineAccount,
    DWORD AccountType
    )
{
    LPWSTR wAccount;
    LPWSTR wPassword;
    USER_INFO_1 ui;
    DWORD cbAccount;
    DWORD cbLength;
    DWORD dwError;

    //
    // Ensure a valid computer account type was passed.
    //
    if (AccountType != UF_WORKSTATION_TRUST_ACCOUNT &&
        AccountType != UF_SERVER_TRUST_ACCOUNT &&
        AccountType != UF_INTERDOMAIN_TRUST_ACCOUNT
        ) 
    {
        SetLastError(ERROR_INVALID_PARAMETER);
        return FALSE;
    }

    //
    // Obtain number of chars in computer account name.
    //
    cbLength = cbAccount = lstrlenW(MachineAccount);

    //
    // Ensure computer name doesn't exceed maximum length.
    //
    if(cbLength > MAX_COMPUTERNAME_LENGTH) {
        SetLastError(ERROR_INVALID_ACCOUNT_NAME);
        return FALSE;
    }

    //
    // Allocate storage to contain Unicode representation of
    // computer account name + trailing $ + NULL.
    //
    wAccount=(LPWSTR)HeapAlloc(GetProcessHeap(), 0,
        (cbAccount + 1 + 1) * sizeof(WCHAR)  // Account + '$' + NULL
        );

    if(wAccount == NULL) return FALSE;

    //
    // Password is the computer account name converted to lowercase;
    //  you will convert the passed MachineAccount in place.
    //
    wPassword = MachineAccount;

    //
    // Copy MachineAccount to the wAccount buffer allocated while
    //  converting computer account name to uppercase.
    //  Convert password (in place) to lowercase.
    //
    while(cbAccount--) {
        wAccount[cbAccount] = towupper( MachineAccount[cbAccount] );
        wPassword[cbAccount] = towlower( wPassword[cbAccount] );
    }

    //
    // Computer account names have a trailing Unicode '$'.
    //
    wAccount[cbLength] = L'$';
    wAccount[cbLength + 1] = L'\0'; // terminate the string

    //
    // If the password is greater than the max allowed, truncate.
    //
    if(cbLength > LM20_PWLEN) wPassword[LM20_PWLEN] = L'\0';

    //
    // Initialize the USER_INFO_1 structure.
    //
    ZeroMemory(&ui, sizeof(ui));

    ui.usri1_name = wAccount;
    ui.usri1_password = wPassword;

    ui.usri1_flags = AccountType | UF_SCRIPT;
    ui.usri1_priv = USER_PRIV_USER;

    dwError=NetUserAdd(
                wTargetComputer,    // target computer name
                1,                  // info level
                (LPBYTE) &ui,       // buffer
                NULL
                );

    //
    // Free allocated memory.
    //
    if(wAccount) HeapFree(GetProcessHeap(), 0, wAccount);

    //
    // Indicate whether the function was successful.
    //
    if(dwError == NO_ERROR)
        return TRUE;
    else {
        SetLastError(dwError);
        return FALSE;
    }
}

Der Benutzer, der die Kontoverwaltungsfunktionen aufruft, muss über Administratorrechte auf dem Zielcomputer verfügen. Bei vorhandenen Computerkonten kann der Ersteller des Kontos das Konto unabhängig von der Administratormitgliedschaft verwalten. Weitere Informationen zum Aufrufen von Funktionen, die Administratorrechte erfordern, finden Sie unter Ausführen mit speziellen Berechtigungen.

Das SeMachineAccountPrivilege kann auf dem Zielcomputer gewährt werden, um bestimmten Benutzern die Möglichkeit zu geben, Computerkonten zu erstellen. Dadurch können Nichtadministratoren Computerkonten erstellen. Der Aufrufer muss diese Berechtigung vor dem Hinzufügen des Computerkontos aktivieren. Weitere Informationen zu Kontoberechtigungen finden Sie unter Berechtigungen und Autorisierungskonstanten.