ActiveDirectory에 PowerShell로 사용자 일괄 등록

사용자 계정 정보가 포함 된 CSV 파일을 준비하고 Active Directory에 일괄 등록하는 스크립트를 만듭니다.
dsadd 명령에 의한 것이 유명하지만, 여기에서는 Power Shell로 작성해 보자.

사양


  • 1 행째를 헤더로 한 다음과 같은 CSV 파일을 입력 가능하고 임의로 열을 추가할 수 있다고 한다.

  • 성·이름·표시명은, CSV 파일의 스태프 코드, 스탭명으로부터 설정한다.
  • 소속 그룹을 :으로 구분하여 여러 개 지정할 수 있습니다.
  • 각 사용자에 대해 개별 초기 암호를 지정할 수 있습니다.
  • 로그온 가능 시간을 지정한 경우 그대로 net user /times로 전달합니다.
  • 계정 만료 날짜를 yyyy/MM/dd 형식으로 지정할 수 있습니다.

  • 스크립트



    CSV 파일 이름을 users.csv로 설정하고 스크립트와 동일한 폴더에 넣습니다.

    일괄 등록 스크립트
    ipcsv users.csv -Encoding Default | %{
      $staffCode = $_.'スタッフコード'
      # ユーザ定義用の連想配列を作成
      $users = @{
        SamAccountName = $staffCode  # ログオン名
        employeeID = $staffCode  # 従業員ID
        employeeNumber = $staffCode  # 従業員番号
        Name = $_.'スタッフ名'
        Surname = $staffCode  # 姓
        GivenName = $_.'スタッフ名'  # 名
        DisplayName = $staffCode + ' ' + $_.'スタッフ名'  # 表示名
        Path = 'OU=XXXXX,OU=Users,OU=XXX,DC=xxx,DC=ne,DC=jp'  # OUは固定
        Description = $_.'AD説明'  # 説明欄
        UserPrincipalName = $staffCode + '@xxx.xxx.ne.jp'  # ユーザプリンシパル名
        AccountPassword = (ConvertTo-SecureString -AsPlainText $_.'AD初期パスワード' -force)  # 暗号化したパスワード
        ChangePasswordAtLogon = $True  # 次回ログオン時にパスワード変更が必要
        AccountExpirationDate = $_.'AD有効期限'  # アカウントの有効期限
        Enabled = $True  # ユーザを有効にする
      }
      New-ADUser @users  # アカウント追加
    
      # ログオン可能時間帯
      if($_.'ADログオン可能時間' -ne '') {
        $cmdstr = '/c net user ' + $staffCode + ' /DOMAIN /TIMES:' + $_.'ADログオン可能時間'
        cmd $cmdstr
      }
    
      # 所属させるグループ
      $groups = $_.'AD所属グループ' -split ':'
      foreach($group in $groups) {
        Add-ADGroupMember -Identity $group -Members $staffCode
      }
    }
    

    실행 결과



    스크립트에서 정의한 OU 아래를 확인합니다.


    개조해보자



    이 섹션에서는 위의 스크립트를 기반으로 다양한 수정을 수행합니다.

    직원 이름을 성과 이름으로 나누어 등록하려면



    정규 표현(하나 이상의 공백)으로, 성과 이름으로 split 한다. 공백이 없으면 성에 치우쳐진다.
    $fullNameArray = $Name -split '\s+'
    
    Surname = $fullNameArray[0]    # 姓
    GivenName = $fullNameArray[1]  # 名
    

    후리가나를 등록하려면



    후리가나는 벤더 고유의 확장 속성이다. LDAP의 표준 규약에는 없다.
    확장 속성은 New-ADUser의 OtherAttributes 파라미터로 지정할 수 있지만, 여기에서는 Set-ADUser로 추가한다.
    $fullNameKana = ($_.'スタッフ名カナ').trim()
    $fullNameKanaArray = $fullNameKana -split '\s+'
    
    ## フリガナの追加
    Set-ADUser -Identity $staffCode -Add @{
      'msDS-PhoneticLastName' = $fullNameKanaArray[0]
      'msDS-PhoneticFirstName' = $fullNameKanaArray[1]
    }
    

    만료일을 실행일 기준으로 설정하려면



    계정 만료일을 작성일로부터 90일 후로 한다면 다음과 같이 수정한다.
    AccountExpirationDate = (Get-Date).AddDays(90).ToString("yyyy/MM/dd")
    

    Active Directory 사용자와 컴퓨터 화면에서 '계정 기한'을 확인하면 설정한 날짜와 하루가 어긋나 있는 것이 옳다.

    예를 들어 왼쪽 이미지에서 설정 한 만료일 (AccountExpires)은 시간 포함 2019/12/27 00:00:00(JST)이지만 오른쪽 이미지에서는 전날 2019/12/26로 표시됩니다. 이는 '계정 기한'에서는 시간 정보가 생략되어 그 날짜가 종일 유효한지 여부로 생각하기 때문이다. GMT이니까 하루 어긋난다고 해설하고 있는 사이트가 있지만, 그것은 잘못이다.

    ※ 속성 편집기를 표시하려면 [보기] 메뉴에서 [확장 기능 표시]를 활성화합니다.

    기존 계정을 잠그려면



    항목 '잠금' 필드에 무언가를 입력했을 때 계정을 잠그려면 다음 코드를 추가합니다.
    Get-ADUser에서 계정이 있는지 확인한 다음 Set-ADUser에서 Enabledfalse로 재설정합니다.
    if ($_.'ロック' -ne '') {
      $users = Get-ADUser -Filter {SamAccountName -eq $staffCode}
      if ($users -eq $null) {
        Write-Host "存在しないのでロックできません :$staffCode"
        return  # 次のエントリへ
      }
      Set-ADUser -Identity $staffCode -Enabled $false
      Write-Host "ロックしました :$staffCode"
      return  # 次のエントリへ
    }
    
    ForEach-Object (%) 의 경우, continue 에서는 루프의 선두로 이동할 수 없기 때문에 return 를 사용한다.

    모든 그룹에서 벗어나려면



    소속시키는 그룹을 바꾸는 경우 등 일단 모든 그룹에서 벗어나려면 Get-ADGroup과 Remove-ADGroupMember를 조합하여 사용한다.
    $user = Get-ADUser $staffCode -Properties memberOf
    $groups = $user.memberOf | %{Get-ADGroup $_}
    $groups | %{Remove-ADGroupMember -Identity $_ -Members $user -Confirm:$false}
    

    보충



    로그온 가능 시간은 logonHours 옵션으로도 지정할 수 있지만, New-ADUser cmdlet만으로 처리하려고 하면 byte형의 배열(1시간 1비트로 24x7=168비트=21byte)로 주어야 하고, 추천 할 수 없다.net user /times라면, 예를 들면 평일 9시~22시까지 로그인을 인정하는 경우에 M-F,09:00-22:00와 같이 쓸 수 있다. (쉼표가 포함되어 있으므로 더블 따옴표로 둘러싸는 것)

    임시 스태프(파견이나 아르바이트)를 대량으로 고용하는 것을 반복하고 있는 회사에서는 유용할 것이다.

    좋은 웹페이지 즐겨찾기