2014-01-12 161 views
0

所以,我一直在为HP Bios的脚本编写一些任务。有一个称为HPBIOS_BIOSSettingInterface的Wmi命名空间。它基本上有一个特殊的SetBIOSSetting(“Property”,“Value”,“CurrentSetupPassword”)。以前的HP系统只支持KBD编码,我编写了一个函数来编码带有KDB值的字符串,可以在这里找到:http://thomas-malkewitz.webnode.com/news/convert-tokbdstring/,并且使用此编码设置设置密码值时,它可以工作,但是对于新的HP,它只支持UTF-16(我无法找到它的大或小,但都尝试过)。这样做时我不断收到错误。所以,我的问题是,我如何编码一个字符串值并将其传递给此方法。我无法弄清楚我的生活。这里是我的功能:Powershell编码将值传递给WmiMethod

<# 
.Synopsis 
    Sets the Setup Password on an HP Bios. 
.DESCRIPTION 
    This function can be used to set a password on the Bios, it can also be used to clear the password, the current password is needed to change the value. 
    If a new value is being set, and not cleared, it must be between 8 and 30 characters. 
.EXAMPLE 
    Set-HpSetupPassword -NewSetupPassword "MyNewPassword" 
.EXAMPLE 
    Set-HpSetupPassword -ComputerName "mycomputer.mydomain.org" -NewSetupPassword " " -CurrentSetupPassword "MyCurrentPassword" 
.EXAMPLE 
    Set-HpSetupPassword -NewSetupPassword "MyNewSetupPassword" -CurrentSetupPassword "MyCurrentPassword" 
.LINKS 
    https://github.com/necromorph1024/HPTpmAndBitLocker 
#> 
function Set-HpSetupPassword 
{ 
    [CmdletBinding()] 
    [OutputType([void])] 
    Param 
    (
     # ComputerName, Type string, System to set Bios Setup Password. 
     [Parameter(Mandatory=$false, 
        Position=0)] 
     [string] 
     $ComputerName=$env:COMPUTERNAME, 

     # NewSetupPassword, Type string, The value of the password to be set. The password can be cleared by using a space surrounded by double quotes, IE: " ". 
     [Parameter(Mandatory=$true, 
        Position=1)] 
     [string] 
     $NewSetupPassword, 

     # CurrentSetupPassword, Type string, The value of the current setup password. 
     [Parameter(Mandatory=$false, 
        Position=2)] 
     [AllowEmptyString()] 
     [string] 
     $CurrentSetupPassword 
    ) 

    Begin 
    { 
     if (!(Test-Connection -ComputerName $ComputerName -Quiet -Count 2)) 
     { 
      throw "Unable to connect to $ComputerName. Please ensure the system is available." 
     } 

     try 
     { 
      $manufacturer = Get-WmiObject -Class Win32_ComputerSystem -Namespace "root\CIMV2" -Property "Manufacturer" -ComputerName $ComputerName -ErrorAction Stop 
      if ($manufacturer.Manufacturer -ne "Hewlett-Packard") 
      { 
       throw "Computer Manufacturer is not of type Hewlett-Packard. This cmdlet can only be used on Hewlett-Packard systems." 
      } 
     } 
     catch 
     { 
      throw "Unable to connect to the Win32_ComputerSystem WMI Namespace, verify the system is avaialbe and you have the permissions to access the namespace." 
     } 
    } 
    Process 
    { 
     if (-not([String]::IsNullOrWhiteSpace($NewSetupPassword))) 
     { 
      if (($NewSetupPassword.Length -lt 8) -or ($NewSetupPassword.Length -gt 30)) 
      { 
       throw "The Password Values must be be between 8 and 30 characters if not clearing the password." 
      } 
     } 

     $hpBios = Get-WmiObject -Class HP_BiosSetting -Namespace "root\HP\InstrumentedBIOS" -ComputerName $ComputerName -ErrorAction Stop 
     $hpBiosSettings = Get-WmiObject -Class HPBIOS_BIOSSettingInterface -Namespace "root\HP\InstrumentedBIOS" -ComputerName $ComputerName -ErrorAction stop 

     if (($hpBios | Where-Object { $_.Name -eq "Setup Password"}).SupportedEncoding -eq "kbd") 
     { 
      if (-not([String]::IsNullOrEmpty($NewSetupPassword))) 
      { 
       $NewSetupPassword="<kbd/>"+(Convert-ToKbdString -UTF16String $NewSetupPassword) 
      } 
      if (-not([String]::IsNullOrEmpty($CurrentSetupPassword))) 
      { 
       $CurrentSetupPassword="<kbd/>"+(Convert-ToKbdString -UTF16String $CurrentSetupPassword) 
      } 
     } 

     $hpBiosSettings.SetBIOSSetting("Setup Password",$NewSetupPassword,$CurrentSetupPassword) 
    } 
} 

它使返回6是拒绝访问,这是我与旧的BIOS让,直到我创建了一个转换,KbdString方法。我知道我使用的密码是正确的。但我不知道什么编码发送到WmiMethod。感谢您的帮助

这里是GitHub库:https://github.com/necromorph1024/HpTpmAndBitLocker

回答

0

我觉得自己太愚蠢了,甚至现在问这个问题。我回顾了我自己的方法,并且字符串需要使用编码类型进行标记。我知道这一点,这就是为什么我追加<kbd/>的字符串,如果它支持该编码类型。所以,<utf-16/>标记只需要追加到字符串的开头。 OMG,对于任何时候我可能已经浪费了!

1

.NET字符串是Unicode编码,根据对String类的文档。

http://msdn.microsoft.com/en-us/library/system.string(v=vs.110).aspx

+0

你知道,这就是我的想法,现在我更加沮丧,因为它应该与$ hpBiosSettings.SetBIOSSettings(“设置密码”,“MyNewPassword”,“MyCurrentPassword”)一起工作,这让我发疯。谢谢。 – dotps1

0

你如何得到这个与Foreach($计算机$计算机名)循环运行?放在哪里,会有什么特别的语法?

+0

ComputerName参数有一个格式问题,您可以从我的github站点获取更新的函数:https://github.com/necromorph1024/HpTpmAndBitLocker/blob/master/HPTpmAndBitLocker.psm1 您将需要Convert-ToKbdString函数以及。 – dotps1