我正在自动部署
Windows应用商店应用,我想自动设置用户通常在设置超级按钮中配置的设置之一.我了解到这些设置存储在settings.dat文件中,该文件可以在注册表中打开.但这是一个二进制文件,我不知道如何通过Powershell编辑我想要的设置.这是我能做的事情还是不值得的努力?谢谢.
这就是特定设置看起来像注册表
解决方法
当AFAIK未加载到注册表中时,无法编辑注册表文件.我玩了一段时间并找到了一种方法,但您需要暂时将注册表文件加载到注册表中并在那里进行编辑.看来你需要使用reg.exe来做到这一点.
另一个问题是在此注册表文件中使用的自定义属性类型(5f5e10c而不是例如REG_BINARY). PowerShell和.NET API似乎都无法加载它们或正确保存它们.我必须导出密钥,在.reg文件中编辑它们并将它们导回.
另一个需要考虑的特性是所有编码值中包含的时间戳,如this blog post中所述.
这是我设法编写的工作脚本,并在注释中添加了其他说明(您需要以管理员身份运行它或加载注册表文件将失败):
# full path to the registry file to edit $settingsFile = "c:\Users\Damir\AppData\Local\Packages\113f4f59-2aa3-455b-8531-185f633c1ffe_ecet6zh215f6e\Settings\settings.dat" # setting name to change $settingKey = "ServerUrl" # new setting value $newValue = "http://prodserver.local/esign/" # name of temporary .reg file $regFile = ".\settings.reg" # temporary registry location to import registry file into $registryImportLocation = "HKLM\_TMP" # prefix matching the setting in the .reg file $settingKeyPattern = """$settingKey""=" # load the settings file into registry reg load $registryImportLocation $settingsFile # export the settings into .reg file reg export $registryImportLocation $regFile $fileContents = Get-Content $regFile $finalContents = @() $processing = $false Foreach ($line in $fileContents) { If (-Not ($processing)) { If ($line.StartsWith($settingKeyPattern)) { # setting key found,stop copying file contents $processing = $true # read key value without its name $oldSerializedValue = $line.Replace($settingKeyPattern,"") } Else { # setting key not found yet,copy old file contents to output $finalContents += $line } } else { # value can span multiple lines,trim leading spaces from non-first lines $oldSerializedValue += $line.TrimStart(" ") } If ($processing) { If ($oldSerializedValue.EndsWith("\")) { # trailing \ indicates non-final line with key value $oldSerializedValue = $oldSerializedValue.TrimEnd("\") } Else { # split key type and value $match = $oldSerializedValue -match '(.*:)(.*)' # final 8 bytes are timestamp of the value - don't modify $timestamp = $matches[2].Substring($matches[2].Length - 23) # encode new value in UTF-16 $newValueInBytes = [System.Text.Encoding]::Unicode.GetBytes($newValue) # key name and type $newValue = $settingKeyPattern + $matches[1] # encode byte array into required string format Foreach ($byte in $newValueInBytes) { $newValue += [System.Convert]::ToString($byte,16).PadLeft(2,"0") + "," } # end null character string terminator $newValue += "00,00," + $timestamp $finalContents += $newValue # reenable copying of the remaining file $processing = $false } } } # dump new file contents to file $finalContents | Out-File $regFile # import the changed value into registry reg import $regFile # onload the registry file from registry reg unload $registryImportLocation # delete temporary file Remove-Item $regFile
您需要对其进行一些修改以将其包含在部署过程中,但它应该可以帮助您入门.
编辑:我写了一篇accompanying blog post,描述了答案背后的思考过程.它提供了更深入的解释和链接到包含上述脚本的PowerShell function implementation.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。