로그온 시 GPO를 통한 Powershell 스크립트가 올바르게 작동하지 않습니다.

로그온 시 GPO를 통한 Powershell 스크립트가 올바르게 작동하지 않습니다.

Windows 10에서 Windows Store 및 Cortana를 제거하기 위해 Powershell 스크립트를 만들었습니다. 스크립트를 만들고 테스트했습니다. 이제 GPO의 LogonScript에 스크립트를 추가하고 스크립트가 성공적으로 실행되는지 테스트했습니다. 하지만 해야 할 일을 하고 있지 않습니다.

우선 스크립트는 다음과 같습니다.

$WSV =(Get-AppxPackage -Name "*WindowsStore*").name
if ($WSV -eq "Microsoft.WindowsStore") 
    {Get-AppxPackage -allusers "*WindowsStore*" | Remove-AppxPackage}

$Cor =(Get-AppxPackage -Name Microsoft.549981C3F5F10).name
if ($Cor -eq "Microsoft.549981C3F5F10")
    {Get-AppxPackage -allusers Microsoft.549981C3F5F10 | Remove-AppxPackage}

단순히 AppX-Package가 있는지 확인하고 존재하는 경우 제거합니다. 스크립트가 수동으로 시작되면 작동합니다. 하지만 로그온 스크립트로 작동하지 않습니다. 내 첫 번째 생각은 스크립트가 전혀 실행되지 않는다는 것입니다. 그래서 C-root에 폴더 생성을 추가했고, 이 폴더 생성으로 스크립트가 실행되고 있음을 확인할 수 있습니다.

그렇다면 왜 원하는 대로 작동하지 않습니까? 어떻게든 스크립트의 오류 메시지를 얻을 수 있는 방법이 있나요?

실행 정책은 제한되지 않습니다. GPO의 컴퓨터 구성에서 실행되므로 컴퓨터 권한이 있어야 합니다.

답변1

명령은 -AllUsers실행 시 모든 사용자에 대해 패키지를 제거하기에 충분한 권한이 있는지 확인하기 위해 매개 변수를 사용하므로 로그온 스크립트가 아닌 시작 스크립트로 실행합니다.

Set-ExecutionPolicy Unrestricted만일을 대비해 이미 실행 정책이 설정되어 있다고 하더라도 스크립트에 해당 내용을 넣을 것입니다 .

마지막으로, 패키지를 제거하려면 제가 알 수 있는 한 전체 패키지 이름이 필요하므로 제거하려는 앱에 대해 아래 PowerShell을 사용하여 패키지 이름을 가져오세요.

현재 문제 해결에 도움이 되는 논리를 사용하는 대신 아래 명령에 지정된 대로 PowerShell 논리를 사용하세요.

파워셸

Set-ExecutionPolicy Unrestricted;

Get-AppxProvisionedPackage –Online | % {
    If($_.DisplayName -eq "Microsoft.WindowsStore")
        {Remove-AppxProvisionedPackage -Online -PackageName $_.PackageName}
    };

Get-AppxProvisionedPackage –Online | % {
    If($_.DisplayName -eq "Microsoft.549981C3F5F10")
        {Remove-AppxProvisionedPackage -Online -PackageName $_.PackageName}
    };
    
"Microsoft.WindowsStore" | %{
    $p = (Get-AppxPackage -Name $_ | %{$_.PackageFullName});
    If($p){Remove-AppxPackage -Package $p -AllUsers};
    };

"Microsoft.549981C3F5F10" | %{
    $p = (Get-AppxPackage -Name $_ | %{$_.PackageFullName});
    If($p){Remove-AppxPackage -Package $p -AllUsers};
    };

지원 리소스


답변2

PowerShell 코드가 잘못되었습니다.

$WSV =(Get-AppxPackage -Name "*WindowsStore*").name
# can also be written as
$WSV = Get-AppxPackage -Name "*WindowsStore*" | Select-Object -ExpandProperty Name

이 쿼리는 반환된 요소 수에 따라 배열을 반환하는 경우도 있습니다.

PS > Get-Item *.html, *.log

    Directory: /Users/megamorf

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-----          06.04.2020    18:04            730 back-to-work.html
-----          05.10.2020    12:32           4269 jmeter.log
-----          28.09.2020    14:41         246873 olv.log
-----          20.10.2020    16:28         170945 web.log

PS > $Result = (Get-Item "*.log").Name
PS > $Result.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Object[]                                 System.Array

PS > $Result = (Get-Item "*.html").Name
PS > $Result.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     String                                   System.Object

-eq배열을 다룰 때 비교 연산자가 올바르지 않습니다. 그럴 때는 -in( $obj -in $array)나 -contains( $array -contains $obj)를 사용하면 됩니다.

전체 코드는 다음과 같이 단순화될 수 있습니다.

$AppsToDelete = @("Microsoft.WindowsStore", "Microsoft.549981C3F5F10")

foreach ($UnwantedApp in $AppsToDelete) {
    Get-AppxPackage -Name $UnwantedApp -AllUsers | Remove-AppxPackage 
}

관련 정보