Поделиться через


Создание учетной записи компьютера

В следующем примере кода показано, как создать учетную запись компьютера с помощью функции NetUserAdd .

Ниже приведены рекомендации по управлению учетными записями компьютеров.

  • Имя учетной записи компьютера должно быть прописным для обеспечения согласованности со служебными программами управления учетными записями.
  • Имя учетной записи компьютера всегда имеет конечный знак доллара ($). Все функции, используемые для управления учетными записями компьютеров, должны создавать имя компьютера таким образом, чтобы последний символ имени учетной записи компьютера был знаком доллара ($). Для междоменового доверия имя учетной записи — TrustingDomainName$.
  • Максимальная длина имени компьютера — MAX_COMPUTERNAME_LENGTH (15). Эта длина не включает конечный знак доллара ($).
  • Пароль для новой учетной записи компьютера должен быть представлен в нижнем регистре имени учетной записи компьютера без знака доллара ($). Для междоменового доверия пароль может быть произвольным значением, которое соответствует значению, указанному на стороне доверия отношения.
  • Максимальная длина пароля — LM20_PWLEN (14). Пароль должен быть усечен до этой длины, если имя учетной записи компьютера превышает эту длину.
  • Пароль, указанный во время создания учетной записи компьютера, действителен только до тех пор, пока учетная запись компьютера не станет активной в домене. Новый пароль устанавливается во время активации отношений доверия.
#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;
    }
}

Пользователь, вызывающий функции управления учетными записями, должен иметь права администратора на целевом компьютере. В случае существующих учетных записей компьютеров создатель учетной записи может управлять учетной записью независимо от членства администратора. Дополнительные сведения о вызове функций, которым требуются права администратора, см. в разделе Запуск с особыми привилегиями.

SeMachineAccountPrivilege можно предоставить на целевом компьютере, чтобы предоставить указанным пользователям возможность создавать учетные записи компьютеров. Это дает возможность неадминистраторам создавать учетные записи компьютеров. Вызывающий объект должен включить эту привилегию перед добавлением учетной записи компьютера. Дополнительные сведения о привилегиях учетной записи см. в разделе Константы привилегий и авторизации.