설치된 MSI 설정의 제품 GUID를 어떻게 찾을 수 있습니까?
설치된 MSI 파일에 대한 제품 GUID를 찾아 ,(제거 방법) 및 에 대한 유지 관리를 수행해야 합니다.
업그레이드 코드 검색의 경우:설치된 MSI 파일에 대한 업그레이드 코드는 어떻게 찾을 수 있습니까?(또는 아래 섹션 2에 표시된 html 테이블 내보내기 스크립트 사용)
짧은 버전
아래의 정보는 시간이 지남에 따라 상당히 증가했으며 약간 지나치게 정교해졌을 수 있습니다.제품 코드를 빠르게 가져오는 방법(4가지 접근 방식):
1 -Use the Powershell "one-liner"
아래로 스크롤하여 스크린샷을 확인하고 단계별로 확인합니다.또한 아래의 고지 사항 - 요청하는 사람에 따라 경미하거나 중간 정도의 위험이 있습니다.저는 괜찮습니다.이 옵션에 의해 트리거된 모든 자체 복구는 일반적으로 취소할 수 있습니다.그러나 트리거된 패키지 무결성 검사는 일부 이벤트 로그 "노이즈"를 추가합니다.메모!IdentifyingNumber
그것은ProductCode
(WMI 특이성).
get-wmiobject Win32_Product | Sort-Object -Property Name |Format-Table IdentifyingNumber, Name, LocalPackage -AutoSize
Powershell 빠른 시작: 보류, 탭, "powershell"을 입력하고 를 누릅니다.
업데이트: Alexis Coles가 언급한 것처럼 WMI를 건너뛰고 COM(더 빠른 속도)을 통해 이동할 수 있습니다.
$Installer = New-Object -ComObject WindowsInstaller.Installer; $InstallerProducts = $Installer.ProductsEx("", "", 7); $InstalledProducts = ForEach($Product in $InstallerProducts){[PSCustomObject]@{ProductCode = $Product.ProductCode(); LocalPackage = $Product.InstallProperty("LocalPackage"); VersionString = $Product.InstallProperty("VersionString"); ProductPath = $Product.InstallProperty("ProductName")}} $InstalledProducts
업그레이드 코드를 원한다면 html 내보내기를 대신 사용할 수 있습니다(아래 섹션 2).
2 -Use VBScript
(github.com 의 스크립트 - HTML 내보내기 버전)
아래 "대체 도구"(섹션 3)에 설명되어 있습니다.이 옵션은 아래에 자세히 설명된 이유로 인해 Powershell보다 안전할 수 있습니다.기본적으로 WMI를 통과하지 않기 때문에 MSI 자체 복구를 트리거할 수 없고 훨씬 빠릅니다(MSI COM API에 직접 액세스함).그러나 Powershell 옵션(여러 줄의 코드)보다 더 관련이 있습니다.
주의:html 버전도 업그레이드 코드를 가져옵니다.자체 복구 및 과도한 로깅을 모두 트리거할 수 있습니다.스크립트 자체에 포함된 경고를 봅니다.일반적으로 문제 없이 실행되지만 완료하는 데 시간이 걸립니다.
3 -Registry Lookup
어떤 사람들은 등기소에서 물건들을 찾아보면서 욕을 합니다.제가 추천하는 접근법이 아닙니다. 저는 적절한 API(즉, OS 함수 호출)를 거치는 것을 좋아합니다.API 구현의 내부에서만 설명되는 이상한 예외는 항상 있습니다.
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall
HKCU\Software\Microsoft\Windows\CurrentVersion\Uninstall
4 -Original MSI File / WiX Source
MSI 파일 및 기타 속성의 에서 를 찾을 수 있습니다.그러나 GUID는 설치 시 적용되는 변환에 의해 (거의) 재정의될 수 있으므로 제품이 등록된 GUID와 일치하지 않을 수 있습니다(위의 접근 방식 1 및 2는 이러한 드문 시나리오에서 Windows에 등록된 실제 제품 코드를 보고합니다).
MSI 파일을 보려면 도구가 필요합니다.다운로드할 수 있는 무료 도구 목록은 다음 답변 하단을 참조하십시오(또는 아래 빠른 옵션 참조).두 개 이상의 MSI 파일의 내용을 비교하려면 어떻게 해야 합니까?
업데이트: SuperOrca를 다운로드할 수 있습니다. 이 도구는 작업을 완료하기에 충분합니다. MSI를 설치하고 열고 Property 테이블로 바로 이동하여 다음을 찾을 수 있습니다.ProductCode
row (말웨어 검사를 통해 다운로드를 실행하십시오 - virustotal.com 를 사용하여 그렇게 할 수 있습니다 - 업로드한 내용을 검색하기 위해 수십 개의 안티바이러스 및 맬웨어 제품군을 사용하는 온라인 검색).
Orca는 Microsoft의 자체 도구이며 Visual Studio 및 Windows SDK와 함께 설치됩니다.-under를 검색하고 MSI가 있으면 설치합니다.
- 현재 경로:
- 필요에 따라 경로 끝에 버전 번호를 변경합니다(분명히).
그리고 아래에서 "유기적으로 성장"한 원래의 답을 찾을 수 있을 것입니다.
이 작업을 수행해야 하는 경우 아래의 "MSI 패키지 제거" 섹션을 참조하십시오.
제품 코드 검색
업데이트: 업그레이드 코드가 필요한 경우 다음 답변을 확인하십시오.설치된 MSI 파일에 대한 업그레이드 코드는 어떻게 찾을 수 있습니까?(아래와 유사한 관련 제품 코드, 업그레이드 코드 및 제품 이름이 표 출력에 표시됩니다.)
- PowerShell을 사용할 수 없습니까?아래의 "대체 도구" 섹션을 참조하십시오.
- 제거하시겠습니까?아래의 "MSI 패키지 제거" 섹션을 참조하십시오.
Powershell을 실행합니다(Windows 키를 누른 상태에서 R을 누르고 Windows 키를 해제한 후 "powershell"을 입력하고 확인을 누릅니다). 아래 명령을 실행하여 설치된 MSI 패키지 제품 코드 목록과 로컬 캐시 패키지 경로 및 제품 이름을 가져옵니다(PowerShell 창에서 이름이 잘리지 않도록 최대화).
이 명령줄을 실행하기 전에 아래의 고지 사항을 읽어 보십시오(위험한 점은 없고 잠재적인 문제일 뿐입니다)."대체 도구"의 섹션 3은 VBScript를 사용하여 동일한 정보를 얻을 수 있는 비 WMI 방법을 보여줍니다.패키지를 제거하려는 경우 아래 섹션에 샘플 msiexec이 있습니다.exe 명령줄:
get-wmiobject Win32_Product | Format-Table IdentifyingNumber, Name, LocalPackage -AutoSize
출력은 다음과 유사해야 합니다.
참고! WMI에서 "제품 코드"를 "식별 번호"라고 합니다. 즉, 식별 번호 위의 그림은 제품 코드입니다.
많은 원격 컴퓨터에 대해 이 쿼리를 원격으로 실행해야 하는 경우 아래의 "원격 컴퓨터에서 제품 코드 검색" 섹션을 참조하십시오.
고지 사항(중요, 명령을 실행하기 전에 읽어 보십시오!):이상한 마이크로소프트 설계로 인해 WMI 호출은
Win32_Product
(아래 PowerShell 명령과 같이) 패키지 속성의 유효성을 검사합니다.매우 느릴 뿐만 아니라 드물게 MSI 자체 복구가 트리거될 수 있습니다.이것은 Visual Studio와 같은 작은 패키지나 큰 패키지일 수 있습니다.대부분의 경우 이러한 일은 일어나지 않지만 위험이 있습니다.중요한 회의 직전에 이 명령을 실행하지 마십시오. 결코 위험하지 않습니다(읽기 전용). 그러나 매우 드문 경우에 수리가 길어질 수 있습니다(문제의 패키지에서 적극적으로 방지하지 않는 한 자가 수리도 취소할 수 있습니다).그러나 Win32_Product를 다시 호출하면 다시 시작되고 자가 복구가 완료될 때까지 유지됩니다. 완료된 후에도 계속될 수 있습니다.윈도우즈 Installer 자가 복구를 반복하는 원인을 확인하려면 어떻게 해야 합니까?참고로 일부 사람들은 이벤트 로그가 MsiInstaller 이벤트로 가득 찼다고 보고합니다.ID 1035 항목(코드 책임자의 답변 참조) - Win32_Product 클래스에 대한 WMI 쿼리로 인해 발생한 것으로 보입니다(개인적으로는 이 항목을 본 적이 없습니다.이는 위에서 제안한 Powershell 명령과 직접적인 관련이 없으며 WIM 클래스 Win32_Product의 일반적인 사용 상황과 관련이 있습니다.
출력을 테이블 대신 목록 형식으로 가져올 수도 있습니다.
get-wmiobject -class Win32_Product
이 경우 출력은 다음과 유사합니다.
원격 컴퓨터에서 제품 코드 검색
이론적으로 명령 자체의 일부로 원격 시스템 이름을 지정할 수 있습니다.에 " MachineRemote Machine.-ComputerName RemoteMachine
섹션 추가):
get-wmiobject Win32_Product -ComputerName RemoteMachine | Format-Table IdentifyingNumber, Name, LocalPackage -AutoSize
적절한 도메인에서 도메인 관리자 권한으로 실행 중인 경우 이 작업이 작동할 수 있습니다.작업 그룹 환경(소규모 사무실/홈 네트워크)에서는 WMI 호출에 사용자 인증 정보를 직접 추가해야 작동할 수 있습니다.
또한 WMI의 원격 연결은 윈도우즈 방화벽, DCOM 설정 및 UAC(사용자 계정 컨트롤)의 영향을 받습니다(또한 실제 방화벽, 타사 소프트웨어 방화벽, 다양한 종류의 보안 소프트웨어 등 Microsoft 이외의 추가 요인).작동 여부는 사용자의 정확한 설정에 따라 달라집니다.
업데이트: 원격 WMI 실행에 대한 자세한 내용은 다음 답변에서 확인할 수 있습니다.설치된 MSI 파일에 대한 업그레이드 코드를 어떻게 찾을 수 있습니까?방화벽 규칙과 레지스트리 조정을 통해 UAC 프롬프트를 억제하면 작업 그룹 네트워크 환경에서 작업이 수행될 수 있습니다.보안 측면에서 권장되는 변경 사항은 아니지만, 저에게는 효과가 있었습니다.
대체 도구
PowerShell에는 이 필요합니다.설치할 NET 프레임워크(현재 버전 3.5.1에 포함되어 있습니까?2017년 10월).경우에도 실제 PowerShell 애플리케이션 자체가 시스템에서 누락될 수 있습니다.NET이 설치되어 있습니다.마지막으로 다양한 시스템 정책과 권한으로 PowerShell을 비활성화하거나 잠글 수 있다고 생각합니다.
이 경우 제품 코드를 검색하는 몇 가지 다른 방법을 시도할 수 있습니다.제가 선호하는 대안은 VBScript입니다. 빠르고 유연합니다(그러나 특정 컴퓨터에서 잠글 수도 있으며, 스크립팅은 항상 도구를 사용하는 것보다 약간 더 많이 사용됩니다).
- 내장된 윈도우즈 WMI 도구부터 시작하겠습니다.
wbemtest.exe
.
- 시작
wbemtest.exe
Windows 키를 누른 상태에서 R을 누르고 Windows 키를 놓은 다음 "wbemtest.exe"를 입력하고 확인을 누릅니다. - [연결]을 누른 후 [확인](이름 공간 기본값은 root\cimv2)을 누르고 "연결"을 다시 누릅니다.
- 쿼리를 클릭하고 다음 WQL 명령(SQL 버전)을 입력합니다.
SELECT IdentifyingNumber,Name,Version FROM Win32_Product
"사용"을 클릭합니다(또는 동등한 기능). 도구가 현지화됩니다. - 샘플 출력 스크린샷(잘림).가장 좋은 포맷은 아니지만 필요한 데이터를 얻을 수 있습니다.Identifying Number는 MSI 제품 코드입니다.
- 그런 다음 다음과 같은 사용자 지정된 보다 완전한 기능의 WMI 도구를 사용할 수 있습니다.
WMIExplorer.exe
- 이것은 Windows에 포함되어 있지 않습니다.하지만, 그것은 매우 좋은 도구입니다.권장된.
- https://github.com/vinaypamnani/wmie2/releases 에서 확인하십시오.
- 도구를 시작하고 연결을 클릭한 다음 루트\CIMV2를 두 번 클릭합니다.
- 쿼리 탭에서 다음 쿼리를 입력합니다.
SELECT IdentifyingNumber,Name,Version FROM Win32_Product
실행을 누릅니다. - 스크린샷을 건너뛰었습니다. 프로그램에 너무 많은 스크린 속성이 필요합니다.
- 마지막으로 VBScript를 사용하여 MSI 자동화 인터페이스(Windows의 핵심 기능 - WMI와 관련 없음)를 통해 정보에 액세스할 수 있습니다.
- 아래 스크립트를 복사하여 바탕 화면의 *.vbs 파일에 붙여넣고 두 번 클릭하여 실행해 보십시오.바탕 화면에 쓰기 가능해야 합니다. 그렇지 않으면 다른 쓰기 가능한 위치를 사용할 수 있습니다.
- 이것은 훌륭한 VBScript가 아닙니다.간결함은 오류 처리와 완전성보다 선호되었지만, 최소한의 복잡성으로 작업을 수행해야 합니다.
- 스크립트를 실행하는 원본 폴더에 출력 파일이 생성됩니다(폴더는 쓰기 가능해야 함).출력 파일을 호출합니다.
msiinfo.csv
. - 스프레드시트 응용프로그램에서 열 파일을 두 번 클릭하고 가져올 때 쉼표를 구분 기호로 선택하거나 메모장이나 텍스트 뷰어에서 파일을 열기만 하면 됩니다.
- 스프레드시트를 열면 고급 정렬 기능을 사용할 수 있습니다.
- 이 스크립트는 MSI 설치에 대한 상당한 양의 추가 세부 정보를 표시하도록 쉽게 조정할 수 있습니다.설치된 제품을 확인하는 방법, 최신 제품이 이미 설치된 MSI 창 등의 데모를 여기에서 확인할 수 있습니다.
' Retrieve all ProductCodes (with ProductName and ProductVersion)
Set fso = CreateObject("Scripting.FileSystemObject")
Set output = fso.CreateTextFile("msiinfo.csv", True, True)
Set installer = CreateObject("WindowsInstaller.Installer")
On Error Resume Next ' we ignore all errors
For Each product In installer.ProductsEx("", "", 7)
productcode = product.ProductCode
name = product.InstallProperty("ProductName")
version=product.InstallProperty("VersionString")
output.writeline (productcode & ", " & name & ", " & version)
Next
output.Close
현재로서는 제품 코드를 검색할 수 있는 범용 옵션이 더 이상 떠오르지 않습니다. 알고 계신 분들은 추가해 주시기 바랍니다.댓글을 너무 많이 달지 말고 그냥 인라인으로 편집해주세요.
MSI 자동화 인터페이스(COM 기반) 또는 C++ MSI 설치 관리자 함수(Win32 API)를 호출하여 애플리케이션 내에서 이 정보에 액세스할 수 있습니다.또는 위의 샘플처럼 응용프로그램 내에서 WMI 쿼리를 사용할 수도 있습니다.
PowerShell
,wbemtest.exe
또는WMIExplorer.exe
.
MSI 패키지 제거
제품 코드를 찾은 MSI 패키지를 제거하려는 경우 고급 명령 프롬프트를 사용하여 다음과 같이 수행할 수 있습니다(cmd.exe를 검색하고 마우스 오른쪽 버튼을 클릭하여 admin으로 실행).
옵션 1: 로깅 없이 기본적인 대화형 제거(빠르고 간편하게):
msiexec.exe /x {00000000-0000-0000-0000-00000000000C}
빠른 매개 변수 설명:
/X = run uninstall sequence
{00000000-0000-0000-0000-00000000000C} = product code for product to uninstall
또한 원하는 경우 로깅을 활성화(상세)하고 자동 모드로 실행하여 옵션 2로 이동할 수 있습니다.
옵션 2: 상세 로깅을 사용한 자동 제거(배치 파일에 더 적합):
msiexec.exe /x {00000000-0000-0000-0000-00000000000C} /QN /L*V "C:\My.log" REBOOT=ReallySuppress
빠른 매개 변수 설명:
/X = run uninstall sequence
{00000000-0000-0000-0000-00000000000C} = product code for product to uninstall
/QN = run completely silently
/L*V "C:\My.log"= verbose logging at specified path
REBOOT=ReallySuppress = avoid unexpected, sudden reboot
MSI 제거에 대한 포괄적인 참조가 여기에 있습니다(MSI 패키지를 제거하는 다양한 방법).msiexec를 사용하지 않고 명령줄에서 MSI 파일 제거제거하는 방법은 매우 다양합니다.
배치 파일을 작성하는 경우 위의 섹션 3을 참조하십시오. 일반적이고 표준적인 제거 명령줄 변형에 대한 링크된 답변입니다.
그리고 msiexec.exe(명령줄 옵션)에 대한 빠른 링크(MSDN의 msiexec.exe에 대한 명령줄 개요).그리고 테크넷 버전도 있습니다.
다른 MSI 속성/정보 검색(f.ex 업그레이드 코드)
업데이트: MSI 파일에서 코드를 수동으로 찾는 대신 설치된 패키지에 대한 업그레이드 코드를 찾는 방법에 대한 새로운 답변을 찾아보십시오.설치된 패키지의 경우 훨씬 더 안정적입니다.패키지가 설치되지 않은 경우에도 MSI 파일(또는 MSI 컴파일에 사용된 원본 파일)을 조사하여 업그레이드 코드를 찾아야 합니다.아래의 이전 섹션에 남기기:
UpgradeCode 또는 기타 MSI 속성을 가져오려면 위 이미지에 표시된 "LocalPackage"에서 지정한 위치에서 제품의 캐시된 설치 MSI를 열 수 있습니다(예:C:\WINDOWS\Installer\50c080ae.msi
각 시스템에서 고유한 16진수 파일 이름입니다.그런 다음 UpgradeCode에 대한 "속성 표"를 확인합니다(업그레이드 코드를 변환하여 다시 정의할 수 있음). 시스템에서 코드를 프로그래밍 방식으로 검색하는 데 필요한 올바른 값을 얻을 수 있는지 확인합니다. 잠시 후 스크립트를 제공하겠습니다.그러나 캐시된 MSI에서 발견된 업그레이드 코드는 일반적으로 올바릅니다.
캐시된 MSI 파일을 열려면 Orca 또는 다른 포장 도구를 사용합니다.다음은 다양한 툴에 대한 설명입니다(어느 툴이든 상관없습니다).사용할 설치 제품을 선택합니다. InstallShield, WiX, Wise, Advanced Installer 등을 설치합니다.만약 당신이 그러한 도구를 설치하지 않았다면, 당신의 가장 빠른 내기는 Super Orca를 시도하는 것일 수 있습니다. (사용하기는 간단하지만, 저에 의해 광범위하게 테스트되지는 않았습니다).
업데이트: MSI 파일을 보는 데 사용할 수 있는 다양한 무료 제품에 대한 정보가 포함된 새로운 답변입니다.두 개 이상의 MSI 파일의 내용을 비교하려면 어떻게 해야 합니까?
Visual Studio를 설치한 경우 다음을 검색해 보십시오.Orca-x86_en-us.msi
Program Files (x86)
설치(Microsoft의 공식 MSI 뷰어 및 편집기).그런 다음 시작 메뉴에서 Orca를 찾습니다.빠른 시간내에 시간이동 :-).기술적으로 Orca는 Windows SDK(Visual Studio가 아님)의 일부로 설치되지만 Windows SDK는 Visual Studio 설치와 함께 번들로 제공됩니다.Visual Studio가 설치되어 있지 않은 경우 설치되어 있는 사용자를 알고 계십니까?그들에게 이 MSI를 검색해서 당신에게 보내라고 하면 됩니다. (작은 반 MB 파일입니다.) 몇 초가 걸릴 것입니다.업데이트: MSI뿐만 아니라 여러 CAB 파일이 필요합니다. 이러한 파일은 MSI가 발견된 동일한 폴더에 있습니다.그렇지 않은 경우 언제든지 Windows SDK를 다운로드할 수 있습니다(무료이지만 크기가 크며 설치하는 모든 작업이 PC 속도를 저하시킵니다).SDK의 어느 부분에 Orca MSI가 설치되어 있는지 잘 모르겠습니다. 설치되어 있다면 여기에 세부 정보를 추가해 주세요.
- 다음은 MSI 제거 문제에 대한 보다 포괄적인 기사입니다.msiexec를 사용하지 않고 명령줄에서 MSI 파일 제거
- 다음은 레지스트리 또는 캐시된 msi를 사용하여 MSI 정보를 검색하기 위한 몇 가지 추가 옵션이 포함된 유사한 문서입니다.MSI 파일에서 GUID 찾기
유사한 주제(참고 및 접근이 용이하도록 - 이 목록을 정리해야 함):
- Windows 7에 설치된 응용 프로그램의 업그레이드 코드 및 제품 코드를 찾는 방법
- C#에서 설치된 응용 프로그램의 업그레이드 코드를 어떻게 찾을 수 있습니까?
- Wix: 다른 설치 프로그램을 사용하여 이전에 설치된 응용 프로그램을 제거하는 방법
- WiX - 다중 인스턴스 설치에서 주요 업그레이드 수행
- 설치된 제품을 확인하는 방법 - 최신 제품이 이미 설치된 MSI 창(VBScript 사용)
- .msi 파일이 없는 제품 ID GUID를 사용하여 msiexec을 사용하여 제거하는 방법
- MSI 패키지의 GUID 찾기
저는 Stein Asmul에게 직접 답변할 수 있는 Rep 포인트가 충분하지 않습니다. 아마도 누군가가 그에게 메시지를 보낼 수 있을 것입니다. 하지만 여기 기존의 Powershell One-liner보다 더 신뢰할 수 있는 VBScript 솔루션을 적용한 Powershell One-liner가 있습니다. 특히 비관리자로 실행할 때 훨씬 빠릅니다.
$Installer = New-Object -ComObject WindowsInstaller.Installer; $InstallerProducts = $Installer.ProductsEx("", "", 7); $InstalledProducts = ForEach($Product in $InstallerProducts){[PSCustomObject]@{ProductCode = $Product.ProductCode(); LocalPackage = $Product.InstallProperty("LocalPackage"); VersionString = $Product.InstallProperty("VersionString"); ProductPath = $Product.InstallProperty("ProductName")}} $InstalledProducts
설명:7을 3으로 변경하여 컴퓨터 전체가 아닌 사용자별 설치 시 잠복해 있는 프로그램을 찾습니다.
설치 프로그램이 너무 많아 원하는 항목을 쉽게 찾을 수 없는 경우 필터를 제공하고 표시 이름으로 조금 좁힐 수 있는 몇 가지 파워셸이 있습니다.
$filter = "*core*sdk*"; (Get-ChildItem HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall).Name | % { $path = "Registry::$_"; Get-ItemProperty $path } | Where-Object { $_.DisplayName -like $filter } | Select-Object -Property DisplayName, PsChildName
또한 Microsoft 또는 적어도 Microsoft 직원이 만든 것으로 보이는 Product Browser라는 매우 유용한 GUI 도구가 있습니다.
Github 제품 브라우저에서 확인할 수 있습니다.
저는 개인적으로 이 제품에 필요한 GUID를 쉽게 찾을 수 있었습니다.
MSI Finder를 볼 수 있습니다.이름, GUID 또는 위치별로 제품 또는 구성 요소를 검색하고, 해당 속성을 보고, 개별 제품을 복구 또는 제거할 수 있습니다.
고지 사항:비슷한 해결책을 찾고 있었는데, 믿을 만한 것이나 사용하기 쉬운 것을 찾을 수 없었습니다.그래서 저는 이 도구를 개발했습니다.
언급URL : https://stackoverflow.com/questions/29937568/how-can-i-find-the-product-guid-of-an-installed-msi-setup
'programing' 카테고리의 다른 글
Git 1.7+에서 모든 원격 지점을 나열하려면 어떻게 해야 합니까? (0) | 2023.04.28 |
---|---|
UIStackView를 스크롤할 수 있습니까? (0) | 2023.04.28 |
느낌표는 스위프트 언어로 무엇을 의미합니까? (0) | 2023.04.28 |
단일 커밋의 커밋 작성자를 변경하려면 어떻게 해야 합니까? (0) | 2023.04.23 |
wpf 텍스트 상자에서 새 줄 시작 (0) | 2023.04.23 |