Udostępnij za pośrednictwem


Tworzenie nowego konta komputera

Poniższy przykładowy kod pokazuje, jak utworzyć nowe konto komputera przy użyciu funkcji NetUserAdd.

Poniżej przedstawiono zagadnienia dotyczące zarządzania kontami komputerów:

  • Nazwa konta komputera powinna być wielką literą w celu zapewnienia spójności z narzędziami do zarządzania kontami.
  • Nazwa konta komputera zawsze ma końcowy znak dolara ($). Wszystkie funkcje używane do zarządzania kontami komputerów muszą utworzyć nazwę komputera, tak aby ostatni znak nazwy konta komputera był znakiem dolara ($). W przypadku zaufania międzydomenowego nazwa konta to TrustingDomainName$.
  • Maksymalna długość nazwy komputera to MAX_COMPUTERNAME_LENGTH (15). Ta długość nie uwzględnia końcowego znaku dolara ($).
  • Hasło dla nowego konta komputera powinno być małą reprezentacją nazwy konta komputera bez końcowego znaku dolara ($). W przypadku zaufania międzydomenowego hasło może być dowolną wartością zgodną z wartością określoną po stronie zaufania relacji.
  • Maksymalna długość hasła to LM20_PWLEN (14). Hasło powinno zostać obcięte do tej długości, jeśli nazwa konta komputera przekroczy tę długość.
  • Hasło podane w czasie tworzenia konta komputera jest ważne tylko do momentu, aż konto komputera stanie się aktywne w domenie. Nowe hasło jest ustanawiane podczas aktywacji relacji zaufania.
#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;
    }
}

Użytkownik, który wywołuje funkcje zarządzania kontami, musi mieć uprawnienia administratora na komputerze docelowym. W przypadku istniejących kont komputerów twórca konta może zarządzać kontem niezależnie od członkostwa administracyjnego. Aby uzyskać więcej informacji na temat wywoływania funkcji wymagających uprawnień administratora, zobacz Running with Special Privileges.

SeMachineAccountPrivilege można przyznać na komputerze docelowym, aby pozwolić określonym użytkownikom na tworzenie kont komputerowych. Dzięki temu użytkownicy niebędący administratorami mogą tworzyć konta komputerowe. Dzwoniący musi włączyć to uprawnienie przed dodaniem konta komputera. Aby uzyskać więcej informacji na temat uprawnień konta, zobacz Uprawnienia i stałe autoryzacji .