C# 在windows 7上从windows服务读取HKLM
我需要做的是从windows服务中从HKLM读取特定于应用程序的字符串值。注册表配置单元和值是使用windows窗体添加的,该窗体是用于修改windows服务配置值的工具。我无法从windows服务读取值,“不允许请求的注册表访问”。我试图打开并阅读以下内容:C# 在windows 7上从windows服务读取HKLM,c#,registry,C#,Registry,我需要做的是从windows服务中从HKLM读取特定于应用程序的字符串值。注册表配置单元和值是使用windows窗体添加的,该窗体是用于修改windows服务配置值的工具。我无法从windows服务读取值,“不允许请求的注册表访问”。我试图打开并阅读以下内容: rk = Registry.LocalMachine.OpenSubKey(key, RegistryKeyPermissionCheck.ReadSubTree); if (rk != null) { value = rk.Get
rk = Registry.LocalMachine.OpenSubKey(key, RegistryKeyPermissionCheck.ReadSubTree);
if (rk != null)
{
value = rk.GetValue(setting).ToString();
}
应用程序和服务是否使用不同的凭据运行?配置应用程序可能应用了注册表虚拟化()
或者,配置应用程序和服务的比特数可能存在差异,并且可以看到注册表()的不同视图。应用程序和服务是否在不同的凭据下运行?配置应用程序可能应用了注册表虚拟化()
或者,配置应用程序和服务之间可能存在差异,并且可以看到注册表()的不同视图。我现在使用此代码从Windows.NET服务执行此操作
public const string REG_KEY_MINE = @"SOFTWARE\Mine\Test";
using (RegistryKey key = Registry.LocalMachine.OpenSubKey(REG_KEY_MINE, false))
{
UDP_PORT = (int) key.GetValue("UdpPort", 43221);
TCP_PORT = (int) key.GetValue("TcpPort", 8005);
}
因此,您可能不是在默认管理员权限下运行服务???我现在使用此代码从Windows.NET服务执行此操作
public const string REG_KEY_MINE = @"SOFTWARE\Mine\Test";
using (RegistryKey key = Registry.LocalMachine.OpenSubKey(REG_KEY_MINE, false))
{
UDP_PORT = (int) key.GetValue("UdpPort", 43221);
TCP_PORT = (int) key.GetValue("TcpPort", 8005);
}
因此,您可能不是在默认管理员权限下运行服务???您是否也可以发布Winforms应用程序中添加密钥的代码?这显然是一个权限问题,但如果注册表项具有HKLM的默认权限,那么它应该可以工作。它不工作告诉我没有默认权限。我擦了擦水晶球,它说你正在使用“非标准”用户帐户运行服务。LocalSystem和朋友是非常有特权的。运行winform应用程序的帐户通常不是btw。您还可以发布Winforms应用程序中添加密钥的代码吗?这显然是一个权限问题,但如果注册表项具有HKLM的默认权限,那么它应该可以工作。它不工作告诉我没有默认权限。我擦了擦水晶球,它说你正在使用“非标准”用户帐户运行服务。LocalSystem和朋友是非常有特权的。运行winform应用程序的帐户通常不是btw。这是我的猜测(特别是你的猜测#1)是的,似乎是#1。我阻止表单创建这些密钥,并从服务安装包创建密钥。当以管理员身份运行时,仍然可以从表单进行更新。这是我的猜测(特别是你的猜测)是的,似乎是这样。我阻止表单创建这些密钥,并从服务安装包创建密钥。当以管理员身份运行时,仍然可以从表单进行更新。我可以从服务中读取它们。如果您只是读取值,您应该将
false
作为第二个参数传递给OpenSubKey
。您无需使用管理帐户来阅读HKLM。您完全正确,我可以将此打开为FALSE。我将更新代码。如果您只是在读取值,则应将false
作为第二个参数传递给OpenSubKey
。您无需使用管理帐户来阅读HKLM。您完全正确,我可以将此打开为FALSE。我会更新代码。