Как получить причину ошибки из InstallProductKey (SoftwareLicensingService) в PowerShell? - PullRequest
1 голос
/ 15 декабря 2011

Я использую некоторые функции PowerShell для настройки ключей продукта Windows и активации. Я получаю экземпляр SoftwareLicensingService и вызываю InstallProductKey, вот так. Блок trap с суперформатированием является дополнительным для отладки.

trap [Exception]
{
    "=================================================="
    "Trapped:   $($Error[0])"
    "=================================================="
    "Exception: $($_.Exception)"
    "--------------------------------------------------"
    ""
    break
}

$service = Get-WmiObject -Query "SELECT * FROM SoftwareLicensingService"
$service.InstallProductKey("12345-12345-12345-12345-12345")
$service.RefreshLicenseStatus() | Out-Null

Условием ошибки является недопустимый ключ продукта. Я знаю это, потому что я ввел его вручную в диалоговое окно Активировать Windows с панели Система . Но сценарий только показывает мне WMIMethodException или COMException.

==================================================
Trapped:   Exception calling "InstallProductKey" : ""
==================================================
Exception: System.Runtime.InteropServices.COMException (0xC004F025)
   at System.Runtime.InteropServices.Marshal.ThrowExceptionForHRInternal(Int32 errorCode, IntPtr errorInfo)
   at System.Management.ManagementObject.InvokeMethod(String methodName, ManagementBaseObject inParameters, InvokeMethodOptions options)
   at System.Management.Automation.ManagementObjectAdapter.InvokeManagementMethod(ManagementObject obj, String methodName, ManagementBaseObject inParams)
--------------------------------------------------

Exception calling "InstallProductKey" : ""
At line:14 char:31
+ $service.InstallProductKey <<<< ("12345-12345-12345-12345-12345")
    + CategoryInfo          : NotSpecified: (:) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : WMIMethodException

Я не получаю код возврата от метода (несмотря на документацию, подтверждающую, что я не могу найти список кодов ошибок в любом случае). Знаете ли вы, как получить причину ошибки активации (или установки ключа продукта)?

1 Ответ

1 голос
/ 16 декабря 2011

Насколько я вижу, там нет сообщений.Добавление их в вашу ловушку:

$_ | fl * -Force
$_.Exception | fl * -Force

Возвращает все, что есть в исключении, и ничего полезного нет.Поэтому я немного погуглил и нашел здесь фрагмент кода C #: http://www.dozty.com/?tag=change-windows-7-product-key-c-sharp Они собирали ManagementException, а в C # он работал немного лучше.Я переписал этот код в PowerShell и пытался перехватить ManagementException, но безуспешно:

trap [Exception]
{
[System.Management.ManagementException] $_
break
}
$classInstance = new-object System.Management.ManagementObject("root\CIMV2","SoftwareLicensingService.Version=`"6.1.7600.16385`"", $null);
$inParams = $classInstance.GetMethodParameters("InstallProductKey")
$inParams["ProductKey"] =  "12345-12345-12345-12345-12345"
$classInstance.InvokeMethod("InstallProductKey", $inParams, $null)

Выдает: Не удается преобразовать исключение «System.Runtime.InteropServices.COMException (0xC004F050)»

...