如何在Powershell中编辑Windows应用商店设置的settings.dat文件?

南南

我正在自动执行Windows Store应用程序的部署,我想自动设置用户通常会在设置超级按钮中配置的设置之一。我了解到,设置存储在settings.dat文件中,可以在注册表中打开文件。但这是一个二进制文件,我不知道如何通过Powershell编辑所需的设置。这是我什至可以做的事还是值得吗?谢谢。

这就是特定设置的样子regedit 在此处输入图片说明

达米尔·阿尔(Damir Arh)

当注册表文件未加载到注册表中时,AFAIK无法对其进行编辑。我玩了一段时间,并找到了一种解决方法,但是您需要将注册表文件临时加载到注册表中并在其中进行编辑。看来您需要使用reg.exe此功能。

另一个问题是在此注册表文件中使用的自定义属性类型(5f5e10c而不是例如REG_BINARY)。双方的PowerShell.NET API的似乎不能够加载它们或正确保存。我必须导出密钥,在.reg文件中对其进行编辑,然后将其重新导入。

本博客文章所述,要考虑的另一个特殊之处是所有编码值中都包含时间戳记

这是我设法在注释中添加其他说明的有效脚本(您需要以管理员身份运行它,否则加载注册表文件将失败):

# 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

您需要对其进行一些修改,以将其包括在部署过程中,但这应该可以帮助您入门。

编辑:我写了一个附带的博客文章,描述了答案背后的思考过程。它提供了更深入的说明,并链接到包装以上脚本PowerShell函数实现

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章