我最近为Windows编写了一个原生的NT注册表编辑器,并在Windows 7上运行它.令我惊讶的是,除了Windows XP上存在的两个标准根键MACHINE和USER之外,还有一个名为" "无法以任何方式打开的",无论是通过权限更改还是备份权限或其他方式:
有谁知道这个键的用途是什么?我不相信它适用于任何软件,因为在我在机器上安装任何东西之前它就在那里,我相信我在另一个新装置上看到了它.这是相当非常可疑的,我很好奇为什么它在那里.(如果我很好奇,我可能会在没有特权检查的情况下写一个驱动程序打开它,看看会发生什么!)
(我不确定是否将它放在SuperUser或StackOverflow上,因为我认为它可能会进入任何一个.但我可能错了;抱歉,如果这不是合适的地方.)
编辑:
如果忘了说,我不相信你甚至可以使用Win32 API看到这个密钥,比如RegOpenKey
- 你必须使用原生API NtEnumerateKey
.
系统:Windows 7 32位
语言:C++
我试图访问寄存器HKEY_LOCAL_MACHINE\\HARDWARE\\DEVICEMAP\\Scsi\\Scsi Port 0
,密钥Driver
(类型REG_SZ
) - 没问题.
例如,对于读取来说HKEY_LOCAL_MACHINE\\HARDWARE\\DEVICEMAP\\SERIALCOMM
,所有键(类型REG_SZ
)都有斜线\Device\Serial0
.
在读取这些键时,它总是返回2(没有这样的文件),并带有以下示例代码:
HKEY hKey = 0;
DWORD dwType = REG_SZ;
char buf[255] = {0};
DWORD dwBufSize = sizeof(buf);
if( RegOpenKeyEx( HKEY_LOCAL_MACHINE, TEXT("HARDWARE\\DEVICEMAP\\SERIALCOMM"), 0, KEY_QUERY_VALUE, &hKey ) == ERROR_SUCCESS )
{
auto ret = RegQueryValueEx( hKey, TEXT("\Device\Serial0"), 0, &dwType, (LPBYTE)buf, &dwBufSize );
// ret always == 2 for key with slashes
--- CUT ---
Run Code Online (Sandbox Code Playgroud)
使用名称中的斜杠读取键值的正确方法是什么?
我在使用变量而不是文本字符串时遇到了同样的问题.
我认为这两种方法都有单斜杠和双斜杠: …
我有这行代码:
this.Path = pathLookUpLocation.GetValue(RegLookupKey, null).ToString();
Run Code Online (Sandbox Code Playgroud)
当我在我的代码上运行静态分析工具(Coverity)时,我在这里得到一个FORWARD_NULL,说我在这里取消引用null.我无法理解这意味着什么以及如何修复它?
this.Path是一个字符串,pathLookUpLocation是一个RegistryKey,RegLookupKey是一个字符串.
我试图忽略远程桌面连接上的证书警告 - 图像中的一个:
到目前为止,我发现当我选中"不再询问"复选框时,它会生成注册表项:
HKCU:\ Software\Microsoft\Terminal Server Client\Servers
将生成一个新记录,其中包含服务器名称和密钥名称CertHash,其中包含特定于计算机的值.机器的关键是相同的 - 如果我删除它并选中复选框,则会再次生成相同的值.如果我重新创建虚拟机,则会有一个新值,因此我认为它是特定于机器的.
有人能告诉我这个哈希是如何生成的,所以我可以从命令行填充密钥?添加证书不是一个选项,机器将经常重新生成,所以我需要一个选项来自动忽略它,因为我需要将用户连接到机器并在其中运行一些程序.
所以我使用RegEdit将以下内容添加到我的工作站上的注册表中:
HKLM\SOFTWARE \富\酒吧
Bar有一对k/v对"wtf"/"idk".我通过关闭注册表并重新打开它来验证这些更改是"采取"的.嘿,他们还在那里!胀.
RegistryKey key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Foo\Bar");
if (key != null)
{
var = key.GetValue("wtf").ToString();
}
Run Code Online (Sandbox Code Playgroud)
问题是,key为null.
什么时候...
Registry.LocalMachine.OpenSubKey("Software").GetSubKeyNames()
Run Code Online (Sandbox Code Playgroud)
被称为,Foo不会出现在众多的SubKeyNames中.
所以,我显然错过了一些愚蠢的东西.具体到底我错过了什么?
谁能告诉我为什么我无法访问注册表项"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData"
?
如果我查询GetSubKeysNames
的"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer"
它只返回一个值的存在"Secure"
---->在哪里是所有其他子项?
谢谢.
我正在研究文件关联。我已经确定有一个名为UserChoice
以下的密钥:
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\[ext].
Run Code Online (Sandbox Code Playgroud)
UserChoice
只要我创建了该密钥并且Windows尚未创建该密钥,我就能够读取和写入该密钥。但是,如果Windows已经UserChoice
创建了该密钥,那么我需要以管理员身份运行才能访问该密钥。我的最终目标是删除密钥。UserChoice
我注意到 Windows在该密钥上放置了拒绝UserChoice
规则,这阻止了我删除该密钥。如果我能成功删除该规则,我相信我将能够删除该UserChoice
密钥。这是我尝试过的代码:
public static void ShowSecurity(RegistryKey regKeyRoot, string user) {
RegistrySecurity security = regKeyRoot.GetAccessControl(AccessControlSections.All);
foreach (RegistryAccessRule ar in
security.GetAccessRules(true, true, typeof(NTAccount))) {
if (ar.IdentityReference.Value.Contains(User) &&
ar.AccessControlType.ToString().ToLower() == "deny") {
security.RemoveAccessRuleSpecific(ar);
regKeyRoot.SetAccessControl(security);
}
}
}
Run Code Online (Sandbox Code Playgroud)
当 Windows 创建UserChoice
密钥时,它会为当前用户添加一条 Type Deny 的安全规则;许可:特殊。该规则不被继承,UserChoice
仅适用于密钥。
通过一些混乱并以管理员身份运行,我可以访问它RegistryAccessRule
。然而,即使以管理员身份运行,我也无法删除此规则。我在我的研究中读到过,没有一种程序化的方法可以做到这一点。我可以通过 RegEdit 删除此规则。我还可以UserChoice
使用 NirSoft 的文件类型管理器删除密钥。所以我认为有某种方法可以做到这一点。
摘要:有没有一种方法可以删除拒绝规则,以便我可以删除密钥UserChoice …
当我执行以下代码时会导致错误,请帮我解决此问题.
class MySample
{
public static void Main()
{
string eventLogName = "Security";
string sourceName = "BTHUSB";
string machineName = "v.i.com";
EventLog eventLog;
eventLog = new EventLog();
eventLog.Log = eventLogName;
eventLog.Source = sourceName;
eventLog.MachineName = machineName;
foreach (EventLogEntry log in eventLog.Entries.Cast<EventLogEntry>().Reverse())// Entries.Cast<EventLogEntry>().Reverse
{
Console.WriteLine(") Entry type: {0} , Category: {1}, Data: {2}, ID: {3}, Source: {4} \n", log.EntryType, log.TimeWritten, log.EventID, log.InstanceId, log.Source);
}
}
}
Run Code Online (Sandbox Code Playgroud)
错误是,
Run Code Online (Sandbox Code Playgroud)Unhandled Exception: System.IO.IOException: The network path was not found. at Microsoft.Win32.RegistryKey.Win32ErrorStatic(Int32 errorCode, String str) …
在VB.NET中,我可以在Windows注册表中创建一个键,如下所示:
My.Computer.Registry.CurrentUser.CreateSubKey("TestKey")
Run Code Online (Sandbox Code Playgroud)
我可以检查一个键中是否存在这样的值:
If My.Computer.Registry.GetValue("HKEY_LOCAL_MACHINE\MyKey", _
"TestValue", Nothing) Is Nothing Then
MsgBox("Value does not exist.")
Else
MsgBox("Value exist.")
End If
Run Code Online (Sandbox Code Playgroud)
但是,如何检查注册表中是否存在具有特定名称的密钥?
目标:
在Powershell中为特定用户而不是其他用户编辑特定注册表项设置。
已知:
操作系统:Windows 8.1 Embedded Industry Pro(与Win 8.1相同,但具有一些嵌入式功能)
我可以在目标计算机上手动完成此操作,方法是打开REGEDIT,选择HKU,然后单击“文件”菜单,再单击“加载Hive”,导航到用户的配置文件目录,例如:c:\ users \ MrEd,并在出现提示时键入“ ntuser” .dat'-导入HKEY_CURRENT_USER。Hive将被加载到HKU中,您可以在其中导航并进行必要的修改。
摘要:
我有一个Powershell脚本,该脚本返回特定用户的SID,但是在注册表配置单元的上下文中使用时,配置单元“未找到”-因此,我想我必须缺少一个步骤吗?如何从Powershell中“加载配置单元”?还是我在某处缺少特殊的,神奇的,键盘上的山羊胡咒?
Param(
[string]$user= $null
)
Function GetSIDfromAcctName()
{
Param(
[Parameter(mandatory=$true)]$userName
)
$myacct = Get-WmiObject Win32_UserAccount -filter "Name='$userName'"
return $myacct.sid
}
if($user)
{
$sid = GetSIDfromAcctName $user
New-PSDrive HKU Registry HKEY_USERS
$myHiveEntry = Get-Item "HKU:\${sid}"
Write-Host "Key:[$myHiveEntry]"
}
Run Code Online (Sandbox Code Playgroud)