次の方法で共有


新しいコンピューター アカウントの作成

次のコード サンプルでは、 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 は、指定されたユーザーにコンピューター アカウントを作成する機能を付与するために、ターゲット コンピューターに付与できます。 これにより、管理者以外のユーザーはコンピューター アカウントを作成できます。 呼び出し元は、コンピューター アカウントを追加する前に、この特権を有効にする必要があります。 アカウント特権の詳細については、「 Privileges and Authorization Constants」を参照してください。