PowerShell (19)
PowerShell Repository 구성

PowerShell Internal Repository 구성 및 서비스 방법에 대한 포스팅입니다.



PowerShell 모듈을 다운로드하기위해 PSGallery를 많이 사용하고 있습니다.

하지만 인터넷 연결이 불가능한 서버들의 경우 모듈설치를 위해 인터넷이 가능한곳에서 모듈파일을 다운로드 받아 서버로 복사하여 사용하는 방법밖에 없었습니다.

또한, 인터넷망의 Repository를 통해 인증/검증되지 않은 모듈을 설치 및 사용하여 여러 문제들이 발생되어 최소한 사용이 검증된 모듈들을 한곳(Internal Repository) 에 모아두고 배포하는것이 필요할수 있습니다.


이러한 문제들로인한 요구사항이 있다면, 외부에 공개되지 않은 내부 PowerShell Repository를 생성하여 서비스할 수 있습니다.

내부 PowerShell Repository는 크게 아래와 같은 2가지 형태로 구성/제공 할 수 있습니다.

1. SMB(공유폴더)를 이용하여 Repository 서비스

2. IIS를 이용하여 Repository 서비스


SMB의 경우 여러 보안상의 검토사항이 필요하기때문에 IIS를 통한 PowerShell Repository 서비스를 제공하는 방법을 알아보겠습니다.

 - SMB를 통한 서비스의 경우 규모가 작은곳에서 간단히 서비스 하기에는 유용합니다. 구성도 간단하고요.


사전준비

1. OS: Windows Server 2016 (2008R2 이상가능)

2. .NET Framework 4.5 이상

3. 인터넷 연결 가능


설치방법

1. IIS 설치 

IIS를 통해 PowreShell Repository를 구성하여 서비스할 예정이므로, 아래의 명령어를 통해 IIS의 구성요소를 설치합니다.

PS C:\> Install-WindowsFeature -Name Web-Server,Web-Default-Doc,Web-Static-Content,Web-Log-Libraries,Web-Stat-Compression,Web-Filtering,Web-Asp-Net45,Web-ISAPI-Filter,Web-ISAPI-Ext -IncludeManagementTools -Verbose

상기 설치를 완료하고 명령어를 통해 확인해보면 아래와 같은 역할/기능이 설치되었음을 알 수 있습니다.

PS C:\> Get-WindowsFeature -Name "web-*"


Display Name                                            Name                       Install State

------------                                            ----                       -------------

    [ ] 웹 응용 프로그램 프록시                         Web-Application-Proxy          Available

[X] 웹 서버(IIS)                                        Web-Server                     Installed

    [X] 웹 서버                                         Web-WebServer                  Installed

        [X] 보안                                        Web-Security                   Installed

            [X] 요청 필터링                             Web-Filtering                  Installed

            [ ] IIS 클라이언트 인증서 매핑 인증         Web-Cert-Auth                  Available

            [ ] IP 및 도메인 제한                       Web-IP-Security                Available

            [ ] URL 권한 부여                           Web-Url-Auth                   Available

            [ ] Windows 인증                            Web-Windows-Auth               Available

            [ ] 기본 인증                               Web-Basic-Auth                 Available

            [ ] 다이제스트 인증                         Web-Digest-Auth                Available

            [ ] 중앙 SSL 인증서 지원                    Web-CertProvider               Available

            [ ] 클라이언트 인증서 매핑 인증             Web-Client-Auth                Available

        [X] 상태 및 진단                                Web-Health                     Installed

            [X] HTTP 로깅                               Web-Http-Logging               Installed

            [ ] ODBC 로깅                               Web-ODBC-Logging               Available

            [X] 로깅 도구                               Web-Log-Libraries              Installed

            [ ] 사용자 지정 로깅                        Web-Custom-Logging             Available

            [ ] 요청 모니터                             Web-Request-Monitor            Available

            [ ] 추적                                    Web-Http-Tracing               Available

        [X] 성능                                        Web-Performance                Installed

            [X] 정적 콘텐츠 압축                        Web-Stat-Compression           Installed

            [ ] 동적 콘텐츠 압축                        Web-Dyn-Compression            Available

        [X] 일반적인 HTTP 기능                          Web-Common-Http                Installed

            [X] HTTP 오류                               Web-Http-Errors                Installed

            [X] 기본 문서                               Web-Default-Doc                Installed

            [X] 디렉터리 검색                           Web-Dir-Browsing               Installed

            [X] 정적 콘텐츠                             Web-Static-Content             Installed

            [ ] HTTP 리디렉션                           Web-Http-Redirect              Available

            [ ] WebDAV 게시                             Web-DAV-Publishing             Available

        [X] 응용 프로그램 개발                          Web-App-Dev                    Installed

            [ ] .NET 확장성 3.5                         Web-Net-Ext                    Available

            [X] .NET 확장성 4.6                         Web-Net-Ext45                  Installed

            [ ] ASP                                     Web-ASP                        Available

            [ ] ASP.NET 3.5                             Web-Asp-Net                    Available

            [X] ASP.NET 4.6                             Web-Asp-Net45                  Installed

            [ ] CGI                                     Web-CGI                        Available

            [X] ISAPI 필터                              Web-ISAPI-Filter               Installed

            [X] ISAPI 확장                              Web-ISAPI-Ext                  Installed

            [ ] SSI(Server Side Include)                Web-Includes                   Available

            [ ] WebSocket 프로토콜                      Web-WebSockets                 Available

            [ ] 응용 프로그램 초기화                    Web-AppInit                    Available

    [ ] FTP 서버                                        Web-Ftp-Server                 Available

        [ ] FTP 서비스                                  Web-Ftp-Service                Available

        [ ] FTP 확장성                                  Web-Ftp-Ext                    Available

    [X] 관리 도구                                       Web-Mgmt-Tools                 Installed

        [X] IIS 관리 콘솔                               Web-Mgmt-Console               Installed

        [ ] IIS 6 관리 호환성                           Web-Mgmt-Compat                Available

            [ ] IIS 6 메타베이스 호환성                 Web-Metabase                   Available

            [ ] IIS 6 WMI 호환성                        Web-WMI                        Available

            [ ] IIS 6 관리 콘솔                         Web-Lgcy-Mgmt-Console          Available

            [ ] IIS 6 스크립팅 도구                     Web-Lgcy-Scripting             Available

        [ ] IIS 관리 스크립트 및 도구                   Web-Scripting-Tools            Available

        [ ] 관리 서비스                                 Web-Mgmt-Service               Available

[ ] IIS 호스팅 가능한 웹 코어                           Web-WHC                        Available




2. IIS 구성
시작 > 실행 > INETMGR 을 통해 IIS 관리창을 열어 아래와 같이 사이트 > 웹사이트 추가를 클릭합니다.

새로운 창이 열리면 아래와 같이 입력해줍니다.
아래 예제를 위해 D:\Web\PSRepo.delmaster.net 이라는 폴더 구조를 생성하였고, 실제 파일은 없습니다.
(실제경로 및 사이트 이름, 호스트이름의 경우 호스팅하기 원하는 이름을 변경하여 구성하시면 되겠습니다.)
단, 아래 '응용프로그램풀' 이름의 경우(여기서는 PSRepo.delmaster.net) 이후 구성 단계에서 보안설정 시 사용되므로 기억해둡니다.




3. NuGet Server Web Application 다운로드 

첨부된 파일을 다운로드 받아 아래의 경로로 복사합니다. 

    여기서는 생성할 웹사이트명인 'PSRepo.delmaster.net' 폴더를 아래와 같은 구조로 생성하고 다운받은 파일을 넣었습니다.





4. 퍼미션 설정

압축을 푼 파일에 대해 '우클릭' > '속성' 을 눌러 아래와 같이 '편집' 버튼을 누른 후 새롭게 열리는 창에서 '추가' 버튼을 클릭합니다.



'위치' 를 눌러 도메인이 아닌 로컬 컴퓨터를 선택해줍니다. 아래 이미지의 PSREPO는 테스트서버의 호스트명이므로 당연히 컴퓨터 마다 다릅니다.


이후, '2번 IIS 구성' 단계에서 확인했던 '응용프로그램풀' 이름을 이용하여 추가하고, 뒤에 IUSR도 같이 입력하여 다음과 같은 형태로 추가해줍니다.  'IIS APPPOOL\PSREPO.DELMASTER.NET; IUSR'

(다른이름으로 생성하였다면 그 이름을 적어줍니다.)

만약 이름을 다시 확인해야할 필요가 있으면 아래와 같이 확인 가능합니다.('더보기'클릭)


추가가 완료되면 아래와 같이 확인되며, 기본 선택된 '읽기 및 실행', '폴더 내용 보기', '읽기' 권한만 있으면 됩니다.




5. 실제 호스팅에 사용될 응용 프로그램 추가

생성한 웹사이트를 우클릭하여 '응용 프로그램 추가' 를 클릭합니다.



이후 아래와 같이 입력/선택해줍니다.


추가가 완료되면 아래와 같은 구조가 만들어집니다.



6. 서비스 확인

생성한 웹사이트 하위에 만들어진 'repo'를 선택한 뒤, 오른쪽 응용프로그램 찾아보기(PSRepo.delmaster.net on *:80(http)찾아보기) 를 통해 웹브라우저를 통해 사이트를 확인해봅니다.



여기까지 잘 구성되었으면 아래와같은 사이트가 확인되며, 'here' 링크를 클릭하면 배포 가능한 목록이 나옵니다.

'here' 아래에 있는 'Repository URLs'의 URL은 이후에 사용되니 기억해두면 좋습니다.

'here'를 클릭했을때 현재 PSRepository에서 제공되는 항목들이 나타납니다. 

아직 Publish한 항목이 없으므로 빈 화면으로 나오는게 정상입니다.




7. 모듈/패키지 배포 구성

생성한 Repository에 사용자에게 제공할 모듈/패키지를 등록할 수 있도록 구성합니다.

먼저 아래와 그림과같이 응용프로그램 설정을 더블클릭합니다.



여러 설정들이 있는데 'apiKey'의 경우 구성한 Repository에 모듈/패키지를 등록할때 사용할 '암호' 라고 생각하면 됩니다. 해당 PSRepository의 관리자만 알고 있을 암호를 입력합니다. 권장되지는 않지만 만약 암호없이 누구나 업로드할 수 있도록 구성하려면 'requireApiKey'의 값을 'false'로 변경해주면 됩니다.


상기 작업이 완료되면 Powershell 창을 열어 아래와 같이 입력하여 패키지 제공자를 추가해줍니다.

Install-PackageProvider -Name NuGet -Verbose

Get-PackageProvider


이후, 아래의 내용을 ISE에서 입력하여 현재 컴퓨터의 Repository 리스트에 생성한 Repository 추가 작업을 진행합니다.

'Name' 부분에 입력한 'PSRepo' 가 우리가 IIS에 생성한 Repository를 인식할 이름이 됩니다.





8. 모듈 배포

배포할 모듈을 PSGallery에서 다운로드 받아 현재 컴퓨터에 설치 합니다.(여기서는 7Zip4PowerShell을 예제로 진행합니다.)

Install-Module -Name 7Zip4Powershell -Verbose




다운받은 '7Zip4PowerShell' 모듈을 우리가 생성한 Repository(PSRepo)에 배포 합니다.

Publish-Module -Name 7Zip4PowerShell -Repository PSRepo -NuGetApiKey delmaster.net -Verbose



최초 실행일때 아래와 같은 알람이 발생될 수 있으며, 해당 알람이 발생되면 'Y'를 눌러 해당 파일을 설치해주어야합니다.


상기 배포 작업이 완료된 후, 아래의 경로로 가보면 우리가 배포한 '7Zip4PowerShell' 이라는 이름의 폴더가 생성된것을 확인할 수 있습니다.


이 폴더 안으로 들어가면 .nupkg 확장자를 가진 NuGet 패키지가 보입니다.


또한, 웹브라우저에서 확인해보면 배포한 모듈명이 노출되는것을 확인할 수 있으며

PowerShell에서 아래의 명령을 통해 다운로드 설치가 가능함을 확인할수도있습니다.





9. 다른 서버(클라이언트)에서 생성한 Repository를 이용하여 모듈 설치

Repository를 구성한 서버가 아닌 다른 서버에 우리가 구성한 Repository를 추가하여, 조금전 배포한 7Zip4PowerShell을 설치해보겠습니다.

먼저 아래와 같이 NuGet 공급자를 설치해줍니다.


아래와 같이 Repository를 추가해줍니다.


추가한 Repository를 확인해보고, 배포된 7Zip4PowerShell을 설치해봅니다.

Get-PSRepository

Find-Module -Repository PSRepo

Install-Module -Name 7Zip4PowerShell -Repository PSRepo -Verbose





이상 PowerShell Repository를 생성하고, 생성된 Repository에 모듈을 배포하여 다른 서버에서 모듈을 설치하는 과정을 알아보았습니다.





  Comments
댓글 쓰기
RDCMan 2.7 도메인 컴퓨터 원격데스크톱 연결 한방에 등록하기

Remote Desktop Connection Manager 에 도메인에 가입된 모든 컴퓨터를 원격 데스크톱 연결로 일괄 등록할 수 있는 스크립트 입니다.

서버를 관리할때 각각의 서버들에 원격데스크톱 연결로 관리할때의 단점을 'Remote Desktop Connection Manager' (이하 RDCMan) 을 통해 조금더 간단하고 유연하게 관리가 가능한데 도메인에 서버 또는 관리할 컴퓨터가 많다면 등록하는 것 자체가 '일' 이 되겠지요.

기존에 만들어뒀던 [Software/Tools] - RDCMan 2.7 VM 콘솔연결 한방에 등록하기 를 약간 수정하여 도메인의 모든 컴퓨터를 일괄 등록할 수 있게 만들어 두었습니다.

아래의 파일을다운로드 받으신후, 해당파일 우클릭 > 'PowerShell에서 실행' 을 누르면 바탕화면에 도메인명.rdg 파일이 생성됩니다.

RDCMan에서 컴퓨터 리스트로 기본 디스플레이되는 목록은 'IP [호스트명]' 으로 되어지며, 각 컴퓨터 우클릭 > 'Properties' > 'Comment' 부분에는 해당 컴퓨터의 고유이름(DN)이 추가되게 되어있어 해당 컴퓨터가 Active Directory상의 어떤 경로에 위치해 있는지 알 수 있게 되어 있습니다.

 

 

 

 

아래는 해당 스크립트의 소스입니다.

 

<#
    내용: 도메인내 컴퓨터를 Remote Desktop connection Manager에 원격 데스크톱 연결 방식으로 일괄등록
    작성자: 이성환(www.delmaster.net)
    작성일 : 2016.04.29
 업데이트: 2016.04.29
   실행권한 확인후 관리자가 아닐시, 관리자 권한으로 자동 실행
  : 2016.05.02
   기존 파일 유무 확인후, 파일존재시 새로운 파일명으로 생성
#>

Function Permit-Check
{
   Param( [Security.Principal.WindowsBuiltinRole]$Role )
   $CurrentUser = [Security.Principal.WindowsPrincipal]([Security.Principal.WindowsIdentity]::GetCurrent())
   $CurrentUser.IsInRole($Role)
}

$Admin = Permit-Check "administrator"

Write-Host ""
Write-Host "======================www.delmaster.net=============================" -BackgroundColor Black -ForegroundColor White
Write-Host ""

Write-Host "관리자 권한 확인중.." -BackgroundColor Black -ForegroundColor Yellow

if ($Admin -eq "True")
{
 Write-Host "권한확인 성공" -BackgroundColor Black -ForegroundColor Red
 Write-Host ""

    $Path = "$env:userprofile\desktop"
    $Domain = Get-ADDomain
    $DomainName = $Domain.Forest
    Write-Host "현재 도메인에 가입된 컴퓨터를 $Path\$DomainName.rdg 파일로 저장합니다." -BackgroundColor Black -ForegroundColor Yellow
    Write-Host "작업중...." -BackgroundColor Black -ForegroundColor Red
    $TestPath = Test-Path $Path\$DomainName.rdg
       
    if ($TestPath -like "True")
    {
        Write-Host ""
        Write-Host "파일이 존재합니다!!" -BackgroundColor Black -ForegroundColor Red
        Write-Host "해당 경로에 새로운 파일을 생성합니다." -BackgroundColor Black -ForegroundColor Red
        Write-Host ""
        $random = random
        $DomainName = "$DomainName $random"
     }

    Get-ADComputer -Filter * -Properties * | select Name,IPv4Address,DistinguishedName | ? IPv4Address -NotLike "" | Export-csv -path $Path\$DomainName.rdg -encoding utf8
   
    $CompList = Get-Content $Path\$DomainName.rdg
    $CompGet = Import-Csv -Path $Path\$DomainName.rdg
    $CompCount = $CompGet.Count
         
    Write-Output "<?xml version=""1.0"" encoding=""utf-8""?>
    <RDCMan programVersion=""2.7"" schemaVersion=""3""><file><credentialsProfiles />
    <properties><expanded>True</expanded><name>$DomainName</name></properties>" > $Path\$DomainName.rdg
  
    for($i=0;$i -lt $CompCount; $i++)
    {
        $CompName = $CompGet.Name[$i]
        $CompIPv4 = $CompGet.IPv4Address[$i]
        $CompDesc = $CompGet.DistinguishedName[$i]
        Write-Output "<server><properties><displayName>$CompIPv4 [$CompName]</displayName>
        <name>$CompIPv4</name><comment>$CompDesc</comment></properties></server>" >> $Path\$DomainName.rdg
    }

    Write-Output "</file><connected /><favorites /><recentlyUsed /></RDCMan>" >> $Path\$DomainName.rdg
   
    $Encoding = Get-Content -Path $Path\$DomainName.rdg
    $Encoding | Out-File -Encoding utf8 -FilePath $Path\$DomainName.rdg

    Write-Host "모든 작업이 완료 되었습니다." -BackgroundColor Black -ForegroundColor Yellow
    Write-Host "$Path\$DomainName.rdg 파일을 확인하세요." -BackgroundColor Black -ForegroundColor Yellow
    Write-Host ""
    Write-Host "======================www.delmaster.net=============================" -BackgroundColor Black -ForegroundColor White
    Write-Host ""
  
 pause
}
else
{
 Write-Host "관리자 권한으로 실행되지 않았습니다." -ForegroundColor Yellow
 write-Host "현재 실행은 종료되며, 관리자 권한으로 자동 재실행 됩니다." -ForegroundColor Yellow
 sleep(1)
 Start-Process -Verb "Runas" -File PowerShell.exe -Argument "-STA -noprofile -file $($myinvocation.mycommand.definition)"
 Write-Host ""
    Write-Host "======================www.delmaster.net=============================" -BackgroundColor Black -ForegroundColor White
}

 

 

[참고글]

 

  Comments
댓글 쓰기
PowerShell 도메인에 가입된 컴퓨터 정보확인

도메인에 가입된 컴퓨터의 IP 구성 정보, 컴퓨터 이름, OS 버전, 서비스팩 여부, DN, SID, 도메인에 가입된 날짜 또는 시간, 도메인 로그온 횟수 등 여러가지 정보가 필요한 경우가 있습니다.

아래의 파워쉘 스크립트를 통해서 쉽게 확인이 가능하겠습니다.

 

 

 

위의 스크립트를 우클릭하여 'PowerShell 에서 실행' 을 클릭하면 아래와 같은 결과로 출력됩니다.

 

 

get-adcomputer

 

상기 출력되는 내용은 컴퓨터 이름, 컴퓨터의 DNS 이름, IPv4 주소, DN, OS버전, OS의 서비스팩여부, 도메인에 가입된 시간, 변경된 시간, 각 컴퓨터의 마지막 로그온 시간, 로그온횟수, 활성화여부, SID 입니다.

 

아래는 스크립트의 내용입니다.

 

 

<#
    내용: 도메인의 컴퓨터 정보 확인
    작성자: 이성환(www.delmaster.net)
    작성일 : 2016.04.22
    업데이트: -
#>

$Temp = get-ADDomain | select DNSRoot | ConvertTo-Csv
$Domain = $Temp[2]
Get-ADComputer -Filter * -Properties * | select Name,DNSHostName,IPv4Address,DistinguishedName, OperatingSystem,OperatingSystemServicePack,whenCreated,whenChanged,LastLogonDate,logonCount,

Enabled, objectSid | Out-GridView -OutputMode Multi -Title "$Domain 의 Computer"

  Comments
댓글 쓰기
PowerShell 도메인의 모든 컴퓨터에 GPUpdate 즉시 실행

PowerShell을 이용하여 도메인의 모든 컴퓨터의 정책을 새로 고침 하기 위해 invoke-gpupdate 명령을 즉시 실행하는 내용입니다.

관리자 권한으로 실행되어야 하기에 실행시 스크립트 실행권한을 체크하고 관리자 권한이 아닐경우 '현재 실행은 종료되며, 관리자 권한으로 자동 재실행됩니다.' 라는 메세지를 출력합니다.

그렇기에 파워쉘을 관리자 권한으로 실행 후 경로 찾아가서 실행하실 필요없이. 그냥 우클릭해서 'PowerShell에서 실행' 버튼 누르시면 알아서 관리자로 전환되어 집니다.

 

스크립트내의 핵심 명령어인 invoke-gpupdate 명령이 정상 동작하기 위해서 대상 컴퓨터들에 아래 두가지의 방화벽 인바운드 오픈 작업이 필요합니다.

'원격 예약된 작업 관리(RPC)'
'원격 예약된 작업관리 (RPC-EPMAP)'

 

아래는 스크립트 파일과 내용입니다.

붉은색 부분의 도메인만 적절하게 변경해서 사용하면 되겠습니다.

 

 

<#
내용 : delmaster.net 도메인의 모든 컴퓨터에 그룹정책 업데이트 명령을 즉시 실행
작성자 : 이성환
작성일 : 2016.04.15
업데이트 : 2016.04.20
  관리자권한으로 자동 실행되게 변경
#>

Function Permit-Check
 {
   Param( [Security.Principal.WindowsBuiltinRole]$Role )
   $CurrentUser = [Security.Principal.WindowsPrincipal]

([Security.Principal.WindowsIdentity]::GetCurrent())
   $CurrentUser.IsInRole($Role)
 }

$User = Permit-Check "administrator"

if($User -eq "True")
{
 Write-Host "업데이트 명령 전송 작업중..."
 Get-ADComputer -filter * -Searchbase "DC=delmaster,DC=net" | foreach {Invoke-GPUpdate -computer

$_.name -force -RandomDelayInMinutes 0}
 write-Host "모든 서버에 업데이트 명령 전송 완료" -ForegroundColor Yellow
 pause
}
else

 Write-Host "관리자 권한으로 실행되지 않았습니다." -ForegroundColor Yellow
 write-Host "현재 실행은 종료되며, 관리자 권한으로 자동 재실행 됩니다." -ForegroundColor Yellow
 sleep(1)
 Start-Process -Verb "Runas" -File PowerShell.exe -Argument "-STA -noprofile -file

$($myinvocation.mycommand.definition)"
}

  Comments
댓글 쓰기
PowerShell 원격데스크톱 포트 변경

PowrShell을 이용하여 원격 데스크탑 포트 변경하는 내용입니다.

정상 실행에는 관리자 권한이 필요합니다. 

 

아래의 스크립트를 받으신 후 직접 실행시켜도 되고 '로그온 스크립트 정책' 으로 실행하셔도 잘 돌아 갑니다.

스크립트내의 변경할 포트는 53389로 지정되어 있으며 변경해서 사용하면됩니다.

 

 

아래는 파일의 내용입니다.

포트 변경은 아래의 붉은글씨 부분을 수정하시면 되겠습니다.

 

<#
- 내용 : 원격 데스크톱 수신 포트 변경
 - 레지스트리 수정
 - 서비스 재시작
- 작성자 : 이성환 (www.delmaster.net)
- 작성일 : 2016.04.15
- 업데이트 : 2016.04.15
#>


Set-ItemProperty "HKLM:SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" -Name

PortNumber -Value 53389

Restart-Service termservice -Force


 

 

 

 

  Comments
댓글 쓰기
PowerShell 호스트명 확인

PowerShell을 이용하여 현재 컴퓨터의 이름 즉, 호스트명을 가져오기위해 아래의 방법을 사용할 수 있습니다.

 

$env:computername

 

 

  Comments
댓글 쓰기
PowerShell을 이용한 정책 확인 및 수정

파워쉘을 이용하여 그룹정책개체 (GPO) 를 확인하고 수정하는 방법입니다. Powershell에서 Get-GPRegistryValue 명령어와 Set-GPRegistryValue 명령을 통해 레지스트리 기반 정책에 대한 정책 내용 확인과 정책 수정을 할 수 있겠습니다.

 

파워쉘을 통해 방화벽 정책내의 규칙을 수정하기 위해 시작되었으나 각 규칙의 수정은 불가능하고 규칙의 생성 및 삭제만 가능했습니다.

일반적인 레지스트리 기반 정책은 정책 설정을 변경하는것이 가능합니다.

 

아래 예제는 제어판 사용에 대한 정책과 방화벽 정책내의 규칙에 대한 내용입니다.

 

[제어판 정책]

 

1. '제어판 사용 금지 정책' 생성 후 내용 확인

GPMC

 

 

 2. 실제 경로로 이동하여 Registry 파일을 확인하기 위해 경로 확인

정책 GUID

 

 

3. C:\Windows\SYSVOL\sysvol\도메인명\Policies\2번에서확인한GUID\User 경로로 이동 후 Registry 파일을 열어 정책에 대한 레지스트리 경로 확인. 경로 뒤 'NoControlPanel' 부분은 ValueName에 해당되니 참고 하면 되겠습니다.

붉은색 글자는 사용하는 환경 및 정책 설정에 따라 변경될 수 있습니다.

정책 레지스트리

 

 

4. 상기 3번에서 확인한 Registry 경로를 이용하여 정책 정보 확인 (아래 명령어는 한줄입니다.)

Get-GPRegistryValue -Name "제어판 사용 금지" -Key "hkcu\software\microsoft\windows\currentversion\policies\explorer"

 정책 값(Value)에 대한 형식(Type)은 'DWord' 이고 'HasValue' 를 통해 정책이 구성되 있음을 알 수 있습니다.

이때 정책은 'Value' 부분에서 '사용' 또는 '사용안함'이 정의되어 있는데 'Value' 값이 '1' 이기 때문에 '사용'으로 정의 되어있음을 알 수 있습니다. 만약 '사용안함' 으로 되어있다면 값은 당연히 '0' 으로 정의 되어 있을겁니다.Get-GPRegistryValue

 

 

5. 명령을 통해 정책 설정을 변경합니다.  기존 '사용' 에서 '사용안함' 으로 변경하겠습니다. (아래 명령어는 한줄입니다.)

set-GPRegistryValue -Name "제어판 사용 금지" -Key "hkcu\software\microsoft\windows\currentversion\policies\explorer" -Type DWord -ValueName Nocontrolpanel -Value 0

Set-GPRegistryValue

 

 

6. 변경된 내용을 확인하기 위해 아래의 명령어를 통해 확인해보면 정책 설정이 변경되었음을 알 수 있습니다. (아래 명령어는 한줄입니다.)

Get-GPRegistryValue -Name "제어판 사용 금지" -Key "hkcu\software\microsoft\windows\currentversion\policies\explorer"

Get-GPRegistryValue

 

 

7. GUI 환경에서 확인하기 위해 GMPC.msc 를 실행시켜 그룹정책 관리콘솔에서 해당 정책의 내용을 확인해보면 기존 '사용' 에서 '사용안함' 으로 변경되었음을 확인 할 수 있습니다.

GPMC

 

 

8. 만약 해당 정책을 '구성되지 않음' 으로 변경하려면 아래 명령을 통해 정의 할 수 있겠습니다.

set-GPRegistryValue -Name "제어판 사용 금지" -Key "hkcu\software\microsoft\windows\currentversion\policies\explorer" -Disable

Set-GPRegistryValue

 

 

9. Get-GPRegistryValue 명령을 통해 확인해보면 'HasValue' 값이 'False' 즉, '구성되지 않음' 으로 바뀐것을 확인할 수 있습니다.

Get-GPRegistryValue

 

 

10. GUI에서도 확인해 보면 '구성되지 않음' 으로 변경되었음을 알 수 있습니다.GPME

 

 

 

 

 

[방화벽 정책의 규칙]

 

글의 시작에서도 언급했듯이 규칙을 변경하는 것은 불가능합니다. (물론 기존 내용을 복사하여 새롭게 만들고 기존 내용을 지워버리는 응용(?)을 하는것은 가능하나 명령으로서 지원되지 않습니다.)

 

1. 아래의 명령어로 내용 확인

(만들어둔 방화벽 정책의 이름은 'firewall'이고 규칙의 이름은 'IN_8088' 이며, 해당 정책의 인바운드 허용 포트는'8088'이며 '영역'에서 특정 IP를 넣어 두었습니다.)

PS C:\> Get-GPRegistryValue -Name "firewall" -Key hklm\software\policies\microsoft\windowsfirewall\firewallrules

KeyPath     : software\policies\microsoft\windowsfirewall\firewallrules
FullKeyPath : HKEY_LOCAL_MACHINE\software\policies\microsoft\windowsfirewall\fi
              rewallrules
Hive        : LocalMachine
PolicyState : Set
Value       : v2.20|Action=Allow|Active=TRUE|Dir=In|Protocol=6|LPort=8088|RA4=1
              92.168.100.10|RA4=192.168.250.0/255.255.255.0|RA4=192.168.200.10-
              192.168.200.20|Name=IN_8088|

 

 

2. 아래의 명령어로 규칙 변경 시도

set-GPRegistryValue -Name "firewall" -Key hklm\software\policies\microsoft\windowsfirewall\firewallrules -type string -Value "v2.20|Action=Allow|Active=TRUE|Dir=In|Protocol=6|LPort=8088|RA4=192.168.111.0/255.255.255.0|NAME=IN_8088|" -Additive

 

 

3. 결과를 확인해보면(명령어에 대한 결과물 캡쳐를 빼먹었습니다 ㅎㅎ) 기존 규칙은 남아 있고 새로운 규칙이 생성되었음을 알 수 있습니다.방화벽 정책

 

방화벽 규칙

'PowerShell' 카테고리의 다른 글

PowerShell 원격데스크톱 포트 변경  (0) 2016.04.20
PowerShell 호스트명 확인  (0) 2016.04.20
PowerShell을 이용한 정책 확인 및 수정  (0) 2016.03.30
PowerShell 조건문 Switch  (0) 2016.03.02
원격 Powershell 실행  (0) 2016.03.02
PowerShell 조건문 IF  (0) 2016.02.29
  Comments
댓글 쓰기
PowerShell 조건문 Switch

파워쉘의 조건문 중 하나인 스위치를 사용하면 상황에 따라 'IF'문 보다 간단하게 작업을 처리할 수 있습니다.

사용방법은 아래와 같습니다.

 

조건에 쓰일 값을 대입 - 여기서는 임의로 '5' 라는 값을 대입

switch (5)
{
    1 { Write "1입니다." }
    2 { Write "2입니다." }
    3 { Write "3입니다." }
    4 { write "4입니다." }
    5 { write "5입니다." }
    default { "1,2,3,4,5중에 없습니다." }
}

 

 

 

 

상기 내용에 변수를 사용하면 아래와 같이 사용될 수 있겠습니다.

$input = 3
switch ($input)
{
    1 { Write "1입니다." }
    2 { Write "2입니다." }
    3 { Write "3입니다." }
    4 { write "4입니다." }
    5 { write "5입니다." }
    default { "1,2,3,4,5중에 없습니다." }
}

 

파워쉘 스위치

 

 

 

만약 두개 이상의 값을 사용한다면 아래와 같이 사용 가능합니다.

'break' 의 유무에 대해서 이해하면 되겠습니다.

 

switch (1,2)
{
    1 { Write "1입니다." }
    2 { Write "2입니다." }
    3 { Write "3입니다." }
    4 { write "4입니다." }
    5 { write "5입니다." }
    default { "1,2,3,4,5중에 없습니다." }
}

 파워쉘 Switch

 

 

switch (1,2)
{
    1 { Write "1입니다."; break }
    2 { Write "2입니다."; break }
    3 { Write "3입니다."; break }
    4 { write "4입니다."; break }
    5 { write "5입니다."; break }
    default { "1,2,3,4,5중에 없습니다." }
}

 파워쉘 스위치

 

 

 

문자열에 대해서도 사용 가능합니다.

switch ("delmaster")
{
    "delmaster" { Write "delmaster입니다."; break }
    "Lee" { Write "Lee입니다."; break }
    "MS" { Write "MS입니다."; break }
    "Linux" { write "Linux입니다."; break }
    "Unix" { write "Unix입니다."; break }
    default { "어떤것에도 해당되지 않습니다." }
}

 

PowerShell 스위치

 

'PowerShell' 카테고리의 다른 글

PowerShell 호스트명 확인  (0) 2016.04.20
PowerShell을 이용한 정책 확인 및 수정  (0) 2016.03.30
PowerShell 조건문 Switch  (0) 2016.03.02
원격 Powershell 실행  (0) 2016.03.02
PowerShell 조건문 IF  (0) 2016.02.29
PowerShell 변수 사용  (0) 2016.02.29
  Comments
댓글 쓰기