실전: PowerShell 로 소프트웨어 목록 만 들 기 도구

PowerShell 사용
자신의 소프트웨어 목록 도구 만 들 기
Don Jones
《 원문 은 2008 년 11 기 TechNet 잡지 에 발표 되 었 다.
주소:
http://technet.microsoft.com/en-us/magazine/2008.11.windowspowershell.aspx》
 
< 방금 발견, TechNet 잡지 에 이미 이 글 의 번역, 주 소 는:http://technet.microsoft.com/zh-cn/magazine/2008.11.windowspowershell.aspx내 가 비교 해 보 니 나의 번역문 과 원 번역문 의 차이 가 크 지 않 으 니 모두 스스로 선택 할 수 있다.
이번 윈도 파워 셸 칼럼 에서 저 는 여러분 께 매우 실 용적 인 파워 셸 사용법 을 보 여 드 리 겠 습 니 다.
나의 목 표 는:
회사 내 컴퓨터 에 대해 운영 체제 의 버 전 번호 (운영 체제 버 전 을 확인 하 는 가장 좋 은 방법) 와 패 치 패키지 (Service Pack) 버 전 번 호 를 검사 하 는 도 구 를 만 듭 니 다.
하지만 이번 에는 마지막 해결 방안 을 직접 제시 하지 않 고 내 가 이 스 크 립 트 를 어떻게 개 발 했 는 지 차근차근 보 여 주 겠 다.
마지막 도 구 는 좋 지만 이 스 크 립 트 를 개발 하 는 절차 가 더 중요 하 다 고 생각 합 니 다.만약 당신 이 그것 을 어떻게 개발 하고 자신의 업무 에 사용 하 는 지 알 게 된다 면, 당신 의 Powershell 은 시스템 관리 문 제 를 진정 으로 해결 할 수 있 을 것 입 니 다.(옛사람 들 은 물고 기 를 가 르 치 는 것 보다 물고 기 를 가 르 치 는 것 이 낫다 고 말 했다)
정 보 를 찾다
이것 은 첫 번 째 단계 이 며, 일반적으로 가장 어 려 운 것 이다. 도대체 어디에서 운영 체제 와 패 치 버 전 번호 정 보 를 찾 을 수 있 을 까?너 는 아마도 등록 표를 생각 했 을 것 이다. 등록 표 는 확실히 이 방면 의 문 제 를 해결 할 수 있다.그러나 이것 은 일반적으로 나의 마지막 보물 이다. 왜냐하면 등록 표 처리 가 항상 번 거 롭 기 때문이다.
'수집' 과 '정보' 는 나 로 하여 금 가능 한 방법 을 바로 생각 하 게 했다. 윈도 우즈 매 니 지 먼 트 인 스 트 루 먼 트 (WMI), 또 하 나 는 WMI 의 키 워드 는 '원 격' 이다.윈도 파워 셸 1 판 에서 WMI 는 원 격 정 보 를 찾 거나 관리 할 수 있 는 유일한 선택 이기 때문이다.
안 타 깝 게 도 대부분의 윈도 시스템 은 수천 개의 WMI 유형 을 가지 고 있 기 때문에 찾 고자 하 는 정 보 를 찾기 어렵다.저 는 보통 웹 검색 을 시작 으로 'wmi service pack version number' 와 같은 키 워드 를 입력 합 니 다.너 는 비교적 긴 키 워드 를 입력 해야만 비교적 정확 한 결 과 를 얻 을 수 있 을 것 이다.
변 화 된 검색 키 워드 를 시도 해 봐 야 하지만 'wmi SP version' 을 시도 하지 마 세 요. 일반적으로 유용 한 결 과 를 되 돌려 주지 않 습 니 다.대체 키 워드 를 고려 해 보 세 요. 예 를 들 어 'Patches 패 치' 라 고 부 를 수도 있 고 'hotfixes' 라 고 부 를 수도 있 지만' Quick fix engineering 빠 른 복구 프로젝트 '나' qfe patch (qfe 패 치) '일 수도 있 습 니 다.너 는 이것 을 모두 시험 해 봐 야 정확 한 결 과 를 얻 을 수 있 을 것 이다.
컴퓨터 하드웨어 나 윈도 OS 핵심 과 관련 된 정 보 를 찾 으 려 면 검색 키워드 에 'Win 32' 를 추가 할 수 있 습 니 다. 대부분의 WMI 카 테 고리 가 'Win 32' 로 시작 되 기 때 문 입 니 다.
키 워드 를 검색 하고 'Win 32' 를 넣 으 면 가장 좋 은 결 과 를 얻 을 수 있 습 니 다. 'Win 32 Operating System' 이라는 결 과 를 보 았 습 니 다. 이것 은 WMI 카 테 고리 의 이름 입 니 다.
검색 결 과 를 클릭 하지 않 는 방법 도 있다.나 는 먼저 이런 종류의 공식 설명 웹 페이지 를 찾 을 것 이기 때문에, 나 는 분류의 이름 으로 새로운 검색 을 시작 했다.이렇게 한 결과, 첫 번 째 검색 결 과 는 보통 msdn. microsoft. com 에 연결 되 며, 이것 은 분류 설명 문서 로 이 끌 어 갈 것 입 니 다.
[그림 1] 이 문서 의 일부 내용 을 보 여 주 었 습 니 다. 저 는 이 페이지 에서 특히 중요 한 표를 말 았 습 니 다. 바로 이 분류 에서 사용 하 는 운영 체 제 를 열거 한 것 입 니 다.나 는 몇 번 이나 심혈 을 기 울 였 는 지 기억 이 나 지 않 았 는데, 결국 내 가 해 야 할 동작 이 윈도 버 전에 서 전혀 적용 되 지 않 는 다 는 것 을 알 게 되 었 다.그래서 나 는 지금 이 표를 먼저 검사 하 는 습관 을 길 렀 다.
clip_image001
[그림 1] WMI 카 테 고리 에 대한 정 보 를 찾 습 니 다.
이 페이지 를 자세히 살 펴 보면 관심 있 는 두 가지 속성 을 보 았 습 니 다. BuildNumber 와 ServicePack MajorVersion 입 니 다. 사실은 ServicePack MinorVersion 도 유용 할 수 있 습 니 다.하지만 나 는 마이크로소프트 에 2.1 버 전의 패 치 백 이 있 는 것 을 본 적 이 없다.그러나 어쨌든 이 속성 은 우리 가 함께 볼 만하 다.
설계 원형
이것 이 확실히 내 가 원 하 는 속성 임 을 확인 하기 전에 나 는 경솔하게 일 을 처리 하고 싶 지 않다.윈도 파워 셸 은 이 일 을 간단하게 한다.나 는 우선 나의 컴퓨터 에서 이 정 보 를 검사 했다.
Get-WmiObject Win32_OperatingSystem | Select BuildNumber,ServicePackMajorVersion,ServicePack-MinorVersion
clip_image003
자, 부차적인 버 전 은 0 입 니 다. 제 가 예 상 했 던 것 과 마찬가지 로 저 는 그 를 상관 하지 않 겠 습 니 다.다른 정보 도 제 가 생각 했 던 것 처럼 - 제 Windows Server 2008 컴퓨터 버 전 번 호 는 6001 이 고 패 치 버 전 번 호 는 1 입 니 다.
(제 컴퓨터 는 Windows XP SP2 이 고 버 전 번 호 는 2600 이 며 메 인 버 전 번 호 는 2 입 니 다)
지금 나 는 원 격 컴퓨터 에서 비슷 한 테스트 를 할 것 이다.
Get-WmiObject Win32_OperatingSystem �Ccomputer Server2 | Select BuildNumber,ServicePackMajorVersion
   
clip_image005
만약 테스트 가 통 하지 않 는 다 면, 나 는 멈 춰 서서 원인 을 찾 아야 계속 할 수 있다. 아마도 네트워크 연결, 방화벽, 권한 과 관련 이 있 을 것 이다. 이것 은 모두 윈도 파워 셸 의 범 위 를 넘 어 섰 다.일단 내 가 이 일 들 을 모두 해결 하면 나 는 문제 의 다음 단 계 를 계속 할 수 있다. 파일 에서 컴퓨터 이름 을 받 을 수 있다.
컴퓨터 이름 읽 기
내 컴퓨터 이름 목록 이 텍스트 파일 에 저장 되 어 있다 고 가정 하면 줄 마다 컴퓨터 이름 이 있 습 니 다. 가장 쉬 운 방법 은 Get - Content Cmdlet 을 사용 하 는 것 입 니 다.
모든 이름 은 독립 된 문자열 로 되 돌아 갑 니 다.Get - wmiobject cmdlet 는 편리 한 기능 이 있 습 니 다. 바로 그의 - coputername 매개 변수 입 니 다. 이 매개 변 수 는 컴퓨터 이름 집합 을 받 아들 일 수 있 기 때문에 우 리 는 이렇게 할 수 있 습 니 다.
$names = Get-Content c:\computernames.txt
Get-WmiObject Win32_OperatingSystem �Ccomp $names | Select
BuildNumber,ServicePackMajorVersion

clip_image007
지금 문 제 는 내 가 열거 한 숫자 목록 인 데 그 숫자 가 그 컴퓨터 의 것 이 라 고 표시 되 지 않 았 다 는 것 이다.다행히도, Win 32Operating System 클래스 에 컴퓨터 이름 이 들 어 있 는 속성 CSName 이 있 습 니 다.그래서 나 는 이 속성 을 코드 에 넣 을 수 있다. 그러면 나 는 좋 은 결 과 를 얻 을 수 있다.
$names = Get-Content c:\computernames.txt
Get-WmiObject Win32_OperatingSystem �Ccomp $names | Select
CSName,BuildNumber,ServicePackMajorVersion

clip_image009
모듈 화
위 는 경험 이 부족 한 기술자 에 게 는 어 려 울 수 있 기 때문에 마지막 단 계 는 이 절 차 를 하나의 함수 로 구성 하 는 것 이다.하나의 방법 은 파일 이름 을 받 아들 일 수 있 는 함 수 를 써 서 이 함수 가 모든 일 을 하도록 하 는 것 이다.
Function Get-SPInventory ([string]$filename) {
  $names = Get-Content $filename
  Get-WmiObject Win32_OperatingSystem �Ccomp  $names | Select   CSName,BuildNumber,ServicePackMajorVersion
}

clip_image011
우 리 는 전체 코드 를 Get - SPinventory 라 는 함수 로 작 성 했 습 니 다. 나 는 $filename 이라는 입력 매개 변 수 를 사용 하여 정 의 했 습 니 다.그래서 우 리 는 아래 의 방법 으로 이 함 수 를 사용 할 수 있다.
Get-SPInventory c:\computernames.txt

clip_image013
표준 Powershell 명령 을 사용 하여 이 결 과 를 CSV 파일 로 출력 하거나 HTML 로 변환 하거나 다른 형식 으로 변환 할 수 있 습 니 다.
Get-SPInventory c:\computernames.txt | 
Export-CSV SPInventory.csv

clip_image015
하지만 이 함 수 는 아직 완벽 하지 않 습 니 다. 언젠가 Win 32 에 포함 되 지 않 았 는 지 찾 고 싶 습 니 다.Operating System 유형의 일부 정보 (예 를 들 어 모든 컴퓨터 의 BIOS 시리 얼 번호) 는 어떻게 해 야 합 니까?많은 설정 관리 데이터베이스 (Configuration Management Databases, CMDBs) 는 BIOS 를 컴퓨터 의 유일한 표지 코드 로 사용 하 는데 이런 정 보 는 매우 유용 하 다.
나 는 또한 함수 의 출력 이 더욱 유연 하고 내 가 쉽게 정렬 하거나 결 과 를 걸 러 낼 수 있 기 를 바란다.예 를 들 어, 나 는 최종 출력 에 오래된 버 전의 패 치 만 포 함 된 윈도 서버 2003 컴퓨터 를 선택 할 수 있다.
파이프 함수
그럼 저 는 지금 함 수 를 수정 해서 윈도 파워 셸 파이프 에서 더 큰 역할 을 하도록 하 겠 습 니 다.더 구체 적 인 점 은 함수 가 파이프 에서 온 컴퓨터 이름 을 직접 받 아들 이 기 를 바 랍 니 다. 그러면 제 가 함 수 를 사용 할 때마다 컴퓨터 이름 을 어디서 얻 는 지 결정 할 수 있 습 니 다.컴퓨터 이름 은 한 파일 에 있 거나 AD (Active Directory) 에서 함수 가 두 가지 상황 에서 모두 실행 되 기 를 바 랍 니 다.
다음은 파 이 프 를 위 한 함수 입 니 다.
Function Get-SPInventory {
  PROCESS {
    $wmi = Get-WmiObject Win32_OperatingSystem       �Ccomp $_ | Select     CSName,BuildNumber,ServicePackMajorVersion
    Write-Output $wmi
  }
}

clip_image017
이러한 특수 한 함수 유형 은 Process 스 크 립 트 모듈 을 사용 하 는 것 입 니 다. 그 는 제 가 함수 로 보 내 는 모든 파이프 대상 에 대해 한 번 실 행 됩 니 다 (2008 년 7 월 에 Process 스 크 립 트 모듈 에 관 한 글 을 참고 할 수 있 습 니 다. 주 소 는 technet. microsoft. com / magazine / cc 644947. aspx) 라 는 특수 한 $변 수 는 파이프 의 입력 을 자동 으로 입력 합 니 다.우리 가 입력 한 것 이 컴퓨터 이름 이 라면 그 는 순조롭게 집행 할 수 있 을 것 이다.새 함 수 는 아래 와 같이 사용 합 니 다.
Get-Content c:\computernames.txt | Get-SPInventory

clip_image019
보시 다시 피 다른 곳 에서 컴퓨터 이름 을 받 으 면 더 많은 탄력 을 제공 할 수 있 습 니 다. 저 는 명령 의 Get - content 부분 을 컴퓨터 이름 을 얻 을 수 있 는 다른 명령 으로 바 꾸 었 을 뿐 입 니 다.서로 다른 WMI 클래스 (또는 다른 데이터 원본) 를 조회 함으로써 저도 더욱 강력 한 출력 으로 설정 할 수 있 습 니 다.
토론 이 아직 끝나 지 않 았 습 니 다. 다음 달 에 저 는 이 함 수 를 BIOS 시리 얼 번호 로 출력 결과 에 추가 할 것 입 니 다.

좋은 웹페이지 즐겨찾기