使用 PowerShell 远程更改 Windows 产品密钥

Change a Windows product key remotely with PowerShell

我正在尝试 install/activate 远程服务器上的 MAK 密钥。他们都启用了 RemotePS 并设置了防火墙例外规则。

$Results = Invoke-Command -ComputerName Server1 {
    $Props = @{ComputerName = $env:ComputerName}
    slmgr.vbs /ipk "12345-12345-12345-12345-12345"
    $LicStatus = slmgr.vbs /dlv
    $Props.Add('LicenseStatus',$LicStatus)
    New-Object -TypeName PSObject -Property $Props
    }

$Results | Select-Object ComputerName,LicenseStatus

上面确实安装了 MAK 密钥,但我没有得到此过程的任何确认,这就是为什么我尝试添加许可证检查选项 (/dlv) 但在 LicenseStatus 字段中没有返回任何内容的原因。我假设这是因为它 returns 可能是一个多值!?

最终我只是想确认密钥已安装。那里有关于使用 RemotePS 执行此操作的文章,但他们都说会为每台计算机返回一条通知消息,而根据我的经验,情况并非如此:https://4sysops.com/archives/change-a-product-key-remotely-with-powershell/

有什么办法可以检查吗?

我会使用 Cscript.exe 调用 slmgr.vbs 脚本,以便将结果作为字符串数组获取。否则系统将默认使用 Wscript.exe,它旨在将所有内容输出到消息框中。

不幸的是,slmgr 的所有输出都是本地化的,因此在 LicenseStatus 上使用正则表达式或其他东西是不行的(在荷兰 NL 机器上它读取 'Licentiestatus')

可以 做的是使用开关 /dli,因为 returns 一个字符串数组,其中最后一个(非空)值具有状态。

尝试

$Results = Invoke-Command -ComputerName Server1 {
    # install MAK key
    $null = cscript.exe "$env:SystemRoot\System32\slmgr.vbs" /ipk "12345-12345-12345-12345-12345"

    # test LicenseStatus
    $LicStatus = (((cscript.exe "$env:SystemRoot\System32\slmgr.vbs" /dli) | 
                    Where-Object { $_ -match '\S' })[-1] -split ':', 2)[1].Trim()
    # return an object
    [PsCustomObject]@{
        ComputerName  = $env:COMPUTERNAME
        LicenseStatus = $LicStatus
    }
}

$Results