다음을 통해 공유


새 컴퓨터 계정 만들기

다음 코드 샘플에서는 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를 대상 컴퓨터에 부여하여 지정된 사용자에게 컴퓨터 계정을 만들 수 있는 기능을 제공할 수 있습니다. 이렇게 하면 관리자가 아닌 사용자가 컴퓨터 계정을 만들 수 있습니다. 호출자는 컴퓨터 계정을 추가하기 전에 이 권한을 사용하도록 설정해야 합니다. 계정 권한에 대한 자세한 내용은 권한 및권한 부여 상수를 참조하세요.