11

我需要创建以下注册表项 HKLM:\software\bmc software\control-m/agent ,但由于“代理”之前的正斜杠而出现问题

我创建一个没有正斜杠的条目没有问题例如:

PS C:\powershell>  new-item -path 'HKLM:\software\bmc software\control-mXXXagent'

但是使用正斜杠创建失败。

PS C:\powershell>  new-item -path 'HKLM:\software\bmc software\control-m/agent'

New-Item : 指定路径的注册表项不存在。在 line:1 char:10 + new-item <<<< -path 'HKLM:\software\bmc software\control-m/agent' + CategoryInfo : InvalidArgument: (HKEY_LOCAL_MACH...tware\control-m:String) [新项目],ArgumentExceptio n + FullyQualifiedErrorId:System.ArgumentException,Microsoft.PowerShell.Commands.NewItemCommand

并且使用 PowerShell backtic ` 转义字符也无济于事。

PS C:\powershell>  new-item -path 'HKLM:\software\bmc software\control-m`/agent'

New-Item : 指定路径的注册表项不存在。在 line:1 char:10 + new-item <<<< -path 'HKLM:\software\bmc software\control-m /agent' + CategoryInfo : InvalidArgument: (HKEY_LOCAL_MACH...ware\control-m:String) [New-Item], ArgumentExceptio n + FullyQualifiedErrorId : System.ArgumentException,Microsoft.PowerShell .Commands.NewItemCommand

建议将不胜感激。谢谢

4

5 回答 5

10

这是对 Ansgar 指出的帖子的轻微修改:

new-item -path 'HKLM:\software\bmc software'
$key = (get-item HKLM:\).OpenSubKey("SOFTWARE\bmc software", $true)
$key.CreateSubKey('control-m/agent')
$key.Close()

这将使用实际/字符 (0x2F) 创建密钥。

于 2013-08-15T19:10:47.200 回答
3

除了\之外的任何可打印字符在注册表项的名称中都是有效的,但正斜杠在注册表路径中不起作用的原因是 PowerShell 接受正斜杠作为路径分隔符。所以,New-Item -Path 'HKLM:\software\bmc software\control-m/agent'与 相同New-Item -Path 'HKLM:\software\bmc software\control-m\agent', 即它试图将一个名为agent的密钥添加到HKLM:\software\bmc software\control-m中,但它并不存在。

你有几个选择来解决这个问题。

如果您只想要看起来像正斜杠的东西,并且拥有真正的 ASCII 正斜杠字符并不重要,那么您可以做的最简单的事情就是替换 unicode 除斜杠。您可以将其插入双引号字符串,如下所示:

New-Item -Path 'HKLM:\software\bmc software' -Name "control-m$([char]0x2215)agent"

(如果您将所有内容都放在-Path参数中,这也有效,但这样做可能是一个更好的习惯,因此您不必担心路径其余部分中的特殊字符。)

如果它需要是 ASCII 正斜杠,您可以使用 Ansgar Wiechers 链接并由 Keith Hill 详细说明的帖子中的方法,或者您可以使用 .NET 创建子键:

([Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey([Microsoft.Win32.RegistryHive]::LocalMachine, $env:COMPUTERNAME)).CreateSubKey('Software\bmc software\control-m/agent')
  • OpenRemoteBaseKey方法的第一个参数指定注册表配置单元。对于 HKCU 中的键,将LocalMachine更改为CurrentUser
  • 第二个参数指定将访问其注册表的计算机的名称。如果远程注册表服务正在该计算机上运行,​​您可以指定远程计算机。
于 2013-08-15T00:02:58.550 回答
0

您可能需要在 PowerShell 中嵌入 DOS 命令。

$PathCMD = "HKEY_LOCAL_MACHINE\Software\BMC Software"
$command = 'cmd.exe /C reg.exe add "$PathCMD\control-m/agent"'
Invoke-Command -Command $ExecutionContext.InvokeCommand.NewScriptBlock($command)
于 2015-12-07T16:20:27.390 回答
0

这是我对两行方法的改进:

$Path = 'SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers'
    (Get-Item HKLM:).OpenSubKey($path,$true).CreateSubKey("DES 56/56")

如果您接下来需要在该密钥下创建一个项目(例如禁用弱加密),您可以使用类似这样的东西,因为 new-itemproperty 与正斜杠配合得很好。请注意,这需要我刚刚在上面共享的相同 $path 变量和格式。

New-ItemProperty -Path "HKLM:\$Path\DES 56/56" -PropertyType DWORD -Value '0' -Name 'Enabled' -Force

以下是问题的概述:

  1. “New-item”方法似乎不适用于包含正斜杠(例如“/”)的任何方法,因为它表示子键。因此,从 PowerShell v5.1 / 2021 年 7 月开始,“40/128”变成“40”,子键为“128”。不要在这上面浪费时间。
  2. 在“new-item”命令中,正斜杠显然根本无法转义。使用单引号或双引号或反斜杠不起作用。
  3. 至少有两个 ascii 符号看起来与正斜杠相似但不相同。“真实”代码是 [char]0x002F,而不是 [char]0x2215。幸运的是,这种方法不需要代码。
于 2021-08-02T16:16:43.973 回答
-1

下面详细介绍了如何将注册表项(包括正斜杠)串在一起的示例:

$value = "2048"
$value1 = "0"
$regpath = "hklm:\SYSTEM\CurrentControlSet\Services\lanmanworkstation\parameters"
$name = "MaxCmds"
$name1 = "RequireSecuritySignature"
$PropertyType = "Dword"    
New-ItemProperty -path $regpath -name $name -value $value -PropertyType $PropertyType 
Set-ItemProperty -path $regpath -name $name1 -value $value1 

因此,根据您的要求,请执行以下操作:

$name1 = "something with a /"
于 2013-08-14T15:45:20.017 回答