반응형

이번 포스팅에서는 ChatGPT 활용하여 Bulk 작업을 진행 진행에 대한 결과를 CSV 내보낼 있는 foreach, try, catch 구문을 다뤄 보겠습니다. 

 

사실 Powershell 영역은 제가 어려워하는 파트 하나이며, 되도록 단순하고 이해하기 쉽게 Script 작성하려고 합니다.

단순한 구조가 누군가에게 전달하여 이해시키기는 쉽지만, 활용 영역이 제한적일 밖에 없습니다.

또한 단순하게 작성한 만큼 연계되는 동작은 여러 개의 Script 만들어야 하기 때문에 매우 번거롭습니다. ChatGPT에게 Sample Script 학습 시킨 , 원하는 작업을 동일한 구조로 생성을 요청하면 유용한 Script 제작할 있습니다.

 

I.  Import-csv | Foreach-Object 구조로 메일 그룹 생성

아래와 같이 BulkTest 하위에 Group 이라는 OU 있습니다.

개체 생성 위치

 

Group OU 아래의 CSV 파일을 이용하여 메일 그룹 생성에 대한 요청을 받았습니다.

Group List CSV

 

메일 그룹을 생성하는 명령어 구조는 다음과 같습니다.

#메일 그룹 생성
New-DistributionGroup -Name [Name] -PrimarySMTPAddress [Main Email Address] -DisplayName [표시이름] -OrganizationalUnit [OU 위치] -Type [Security or Distribution]

#예시
New-DistributionGroup -Name TestGroup1 -PrimarySMTPAddress TestGroup1@contoso.kr -DisplayName TestGroup1 -OrganizationalUnit 'OU=Group,OU=BulkTest,DC=corp,DC=contoso,DC=kr' -Type Security

기술자료: New-DistributionGroup (ExchangePowerShell) | Microsoft Learn

 

 

CSV 파일을 이용하여 Bulk 작업이 필요한 경우 다음과 같이 진행합니다.

Import-Csv -Path C:\csv\Group.csv |ForEach-Object {New-DistributionGroup -Name $_.Name -PrimarySmtpAddress $_.PrimarySMTPAddress -DisplayName $_.Displayname -OrganizationalUnit 'OU=Group,OU=BulkTest,DC=corp,DC=contoso,DC=kr' -Type Security}

 

진행 결과

ECP 상의 결과

 

대부분의 테스트 환경에서는 깔끔하게 명령어가 오류 없이 진행됩니다.

하지만 실제 운영환경에서 Bulk 작업을 진행하면, 많은 변수가 생길 있습니다.

예를 들면 동일한 속성값을 사용하면 개체는 생성되지 않고 오류가 발생합니다.

만약 생성해야 개체가 20~30개가 아니라 300~1000개씩 작업할 경우에는 순식간에 진행하는 명령어 속에서 오류를 확인하는 것은 매우 골치 아픈 작업입니다.

 

아래와 같이 300개의 그룹을 생성하는 명령어를 진행하였고, 1~23까지는 중복 이름이 사용되었기 때문에 오류가 발생합니다.

Powershell Error

 

그러나 Bulk 명령어 구조상 아래와 같이 계속 진행됩니다.

Powershell 진행 예시

 

II. foreach, ErrorAction, try, catch를 이용하여 메일 그룹 생성 및 결과 내보내기

이번에는  ChatGPT에게 Import-Csv -Path C:\csv\Group.csv |ForEach-Object {New-DistributionGroup -Name $_.Name -PrimarySmtpAddress $_.PrimarySMTPAddress -DisplayName $_.Displayname -OrganizationalUnit 'OU=Group,OU=BulkTest,DC=corp,DC=contoso,DC=kr' -Type Security} 학습시킨 , 진행 결과 오류에 대해서 CSV 내보내기는 Script 작성을 요청하였습니다.

# Import CSV file
$entries = Import-Csv -Path C:\csv\Group.csv

# Empty array to collect results
$results = @()

foreach ($entry in $entries) {
    try {
        # Create new distribution group
        New-DistributionGroup -Name $entry.Name -PrimarySMTPAddress $entry.PrimarySMTPAddress -DisplayName $entry.Displayname -OrganizationalUnit "OU=Group,OU=BulkTest,DC=corp,DC=contoso,DC=kr" -Type Security -ErrorAction Stop 

        # Add to results array
        $results += [PSCustomObject]@{
            Name = $entry.Name
            PrimarySMTPAddress = $entry.PrimarySMTPAddress
            DisplayName = $entry.Displayname
            Status = "Success"
        }
    } catch {
        # If there's an error, add it to the results array
        $results += [PSCustomObject]@{
            Name = $entry.Name
            PrimarySMTPAddress = $entry.PrimarySMTPAddress
            DisplayName = $entry.Displayname
            Status = "Failed - $($_.Exception.Message)"
        }
    }
}

# Export results to CSV
$results | Export-Csv -Path C:\csv\Output_GroupList.csv -NoTypeInformation -Encoding UTF8

해당 Script PS1 파일로 저장합니다.

Script

 

기존에 생성된 개체를 완전히 제거 , Exchange Powershell에서 Script 실행

Script 실행

 

아래와 같이 결과에 대한 CSV 파일 생성됨 확인

Result CSV

 

작업 결과에 대한 List 필터링 확인함으로써 누락되는 부분을 줄일 있습니다.

Result 확인

 

Script Error 기록을 남기는지 확인하기 위해서 생성된 메일 그룹 일부를 삭제

개체 삭제

 

다시 Script 실행

Script 실행

 

Output 파일을 확인해보면, 아래와 같이 Success Failed 확인할 있으며, Failed 경우에는 사유까지 기록된 다는 것을 있습니다.

실패 기록

 

그리고 ChatGPT에게 Script 분석을 요청하면, 동작의 원리를 배우는데 많은 도움이 됩니다.

해설1
해설2

 

III. ChatGPT생성된 Script를 학습시킨 뒤, 다른 명령어도 동일한 구조의 Script 생성

기존에 생성한 Script 새로운 채팅창에 입력합니다.

Script 학습

 

아래와 같이 분석작업을 진행합니다.

Script 분석1
Script 분석2

 

이번에는 M365에서 Hard Match 필요한 ImmutableID Bulk 입력하는 Script 생성해 보겠습니다.

채팅창에 아래와 같이 입력합니다.

Import-Csv -Path C:\csv\hardmatch.csv|Foreach-Object {Set-MsolUser -UserPrincipalName $_.UPN -ImmutableId $_.ImmutableID}  명령어도 위와 동일한 구조의 Script로 만들어주세요.

아래와 같이 Script 생성됩니다.

# Import CSV file
$entries = Import-Csv -Path C:\csv\hardmatch.csv

# Empty array to collect results
$results = @()

foreach ($entry in $entries) {
    try {
        # Set ImmutableId for the user
        Set-MsolUser -UserPrincipalName $entry.UPN -ImmutableId $entry.ImmutableID -ErrorAction Stop 

        # Add to results array
        $results += [PSCustomObject]@{
            UPN = $entry.UPN
            ImmutableID = $entry.ImmutableID
            Status = "Success"
        }
    } catch {
        # If there's an error, add it to the results array
        $results += [PSCustomObject]@{
            UPN = $entry.UPN
            ImmutableID = $entry.ImmutableID
            Status = "Failed - $($_.Exception.Message)"
        }
    }
}

# Export results to CSV
$results | Export-Csv -Path C:\csv\Output_HardmatchList.csv -NoTypeInformation -Encoding UTF8

아래와 같이 Script 구성이 어떻게 되어 있는지도 설명해줍니다.

Script 구성

위와 같은 방법으로 ChatGPT 통하여 Bulk 작업에 대해 결과를 확인할 있는 Script 쉽게 제작할 있습니다.

반응형

+ Recent posts