Tag: 注册表

在C#2.0中使用Registry(Windows窗体)

我是Windows Forms的新手。 我正在.Net Framework 2.0中设计一个Windows应用程序,其中,我需要在系统中的某处存储用户名和密码,并在每次打开我的应用程序时访问它们,有时我需要在用户命令上更改这些凭据。 我听说注册表是这样做的最佳方式。 我对C#.Net中使用注册表一无所知。 你能帮帮我吗 如何获取注册表中的值以及如何将值设置为注册表。 ?? 我正在使用.Net Framework 2.0

查询是否禁用了Windows服务(不使用注册表)?

是否有.NET(C#)方法或API调用,我可以用来查询Windows服务是否被禁用? 相关的MSDN文章在这里 。 我想避免直接查询注册表。 下面是我现在正在使用的一些代码(并且它可以工作)。 然而,我正在寻找更优雅,更少侵入性的东西。 const String basepathStr = @”System\CurrentControlSet\services\”; String subKeyStr = basepathStr + servicenameStr; using (RegistryKey key = Registry.LocalMachine.OpenSubKey(subKeyStr)) { return (int) key.GetValue(“Start”); } 我确实找到了一个简短的问题,但我希望得到一个更好的答案,因为答案可能已经过时(3年过去了)。

模拟和CurrentUser注册表访问

环境:Windows XP SP3,C#,. Net 4.0 问题: 我试图在模拟类中添加对模拟用户注册表配置单元的访问权限,并且我根据被模拟的用户类型遇到问题(或者更准确地说,限制似乎是模仿用户)。 我最初遵循CodeProject的模拟示例,该示例显示在使用通过从LogonUser()获取的原始令牌调用DuplcateToken()生成的重复令牌开始模拟后调用LoadUserProfile() LogonUser() 。 我无法让这个示例在我的环境中使用管理员帐户冒充有限的用户(从示例中包含的屏幕截图看来,它似乎是在Windows Vista \ 7系统上完成的,并且没有提供有关涉及的帐户类型)。 对LoadUserProfile()的调用抛出了“拒绝访问”的错误。 查看userenv.log显示“LoadUserProfile:无法启用还原权限。”错误c0000022“。 MSDN上的LoadUserProfile文档显示调用进程必须拥有SE_RESTORE_NAME和SE_BACKUP_NAME权限,默认情况下只有Administrators和Backup Operators组的成员具有该权限。 (作为旁注,当我尝试稍后将这两个权限添加到Users组时,我仍然收到拒绝访问但是userenv.log显示“DropClientContext:Client [number]没有足够的权限。错误5”我无法’找到任何信息) 鉴于我冒充的用户没有这些权限,我将调用LoadUserProfile()调用到开始模拟之前,这次加载没有问题,我能够在此测试中读取和写入。 考虑到我发现了我的答案,我创建了帐户类型的条件检查,以便在模拟之前调用LoadUserProfile() ,如果当前用户是管理员的成员,或者等到模仿后如果该成员不是管理员的成员(在后面的例子中,我将依赖具有这些特权的模拟用户)。 不幸的是我错了; 我没有发现我的答案。 当我使用反转角色测试呼叫时(用户>管理员)对LoadUserProfile() )的调用仍然失败,并且Access Denied错误和userenv.log显示相同的“LoadUserProfile:无法启用恢复权限。错误c0000061 ”但是这次是一个不同的错误号。 认为默认情况下可能无法在LogonUser()和\或DuplicateToken()返回的令牌上启用权限,我在从WindowsIdentity.GetCurrent(TokenAccessLevels.AdjustPrivileges | TokenAccessLevels.Query).Token )获取的当前用户令牌(在模拟后发生AdjustTokenPrivilege()上添加了两次AdjustTokenPrivilege()调用。 WindowsIdentity.GetCurrent(TokenAccessLevels.AdjustPrivileges | TokenAccessLevels.Query).Token 。 指定了TokenAccessLevels.AdjustPrivileges和TokenAccessLevels.Query ,因为MSDN上的AdjustTokenPrivilege文档指定在调整的令牌上需要它们(我还尝试使用从System.Diagnostics.Process.GetCurrentProcess().Handle检索的句柄通过调用OpenProcessToken()获取令牌。 System.Diagnostics.Process.GetCurrentProcess().Handle但是当用户在模拟内部和外部调用时失败, GetCurrentProcess()是拒绝访问的函数 与WindowsIdentity…Token一起使用时, AdjustTokenPrivilege()成功返回WindowsIdentity…Token但LoadUserProfile()仍然导致拒绝访问(还原权限)。 在这一点上,我不相信AdjustTokenPrivilege()正在做它的工作,所以我开始确定哪些特权是可用的,以及他们使用GetTokenInformation()获得特定令牌的状态,这导致了它自己的一小部分乐趣。 在学习了一些新东西后,我能够调用GetTokenInformation()并打印出一系列权限及其当前状态,但结果有些不确定,因为Restore和Backup在调用AdjustTokenPrivilege()之前和之后都显示了0的属性作为管理员和冒充管理员(奇怪的是,当调用AdjustTokenPrivilege()时,令牌上的其他三个权限从2更改为1,而不是实际调整的值保持为0的其他权限 我删除了对DuplicateToken()的调用,并将其使用的所有位置替换为LogonUser()返回的令牌,以查看这是否有助于测试令牌上的权限LogonUser()和DuplicateToken()令牌是相同。 当我最初编写模拟类时,我在调用WindowsImpersonationContext.Impersonate()一直使用主令牌而没有任何问题,并认为值得一试。 在下面提供的代码示例中,我可以在以管理员身份运行时模拟和访问用户的注册表,但不是相反。 任何帮助将不胜感激。 post前编辑: 我也尝试使用RegOpenCurrentUser() API代替LoadUserProfile() ,并成功使用管理员>自我和管理员>用户模拟,但是当从其他管理员帐户或用户RegOpenCurrentUser()模拟管理员时,返回指向HKEY_USERS的指针\ S-1-5-18(不管是什么)而不是实际的帐户蜂巢。 我猜是因为它实际上没有加载,这让我回到LoadUserProfile() […]

使用.NET设置注册表项写入权限

我正在尝试在安装过程中向我的应用程序的注册表设置授予对计算机的每个人或所有用户的写访问权限。 我的应用程序在安装后没有直接具有适当的权限,而不需要管理员授予它们,即使密钥和值存在,它们也无法更新? 我有下面的代码段,但是由于未经授权的访问/访问被拒绝,安装程序失败了。 我想我走在正确的轨道上…… 如何在不需要手动注意的情况下解决权限问题? 有更好的方法吗? 我正在尝试通过添加此function来替换Visual Studio设置中的其他安装程序。 protected void GrantAllAccessPermission(String key) { try { SecurityIdentifier sid = new SecurityIdentifier(WellKnownSidType.WorldSid, null); NTAccount account = sid.Translate(typeof(NTAccount)) as NTAccount; // Get ACL from Windows, allow writing to the registry key using (RegistryKey rk = Registry.LocalMachine.OpenSubKey(key, true)) { RegistrySecurity rs = new RegistrySecurity(); // Creating registry access rule […]

在RegistryKey Value更改时接收通知

当HKEY_CURRENT_USER的特定RegistryKey发生更改时,我想要通知。 到目前为止,我通过WMI尝试了这个并没有成功: var query = new WqlEventQuery(string.Format( “SELECT * FROM RegistryKeyChangeEvent WHERE Hive='{0}’ AND KeyPath='{1}’ AND ValueName='{2}'”, hive, keyPath.Replace(“\\”,”\\\\”), valueName)); _watcher = new ManagementEventWatcher(query); _watcher.Scope.Path.NamespacePath = @”root\default”; _watcher.EventArrived += (sender, args) => KeyValueChanged(); _watcher.Start(); (错误是“未找到”) 我的第二种方法是使用WBEM Scripting COM component ,意图将示例从http://msdn.microsoft.com/en-us/library/aa393042(VS.85).aspx移植到c#,但我没有找到c#中WBEM COM的任何使用示例 我发现这个http://www.codeproject.com/KB/system/registrymonitor.aspx类,但它不符合我的需要,因为这个类只监视整个键,我只想要一个特定值的通知(指定通过上面示例中的ValueName进行更改。 编辑:如果您在msdn vbscript示例中将Hive更改为HKEY_CURRENT_USER ,它将停止工作。 我找不到任何关于这种行为的信息,而是2003年的一个链接 EDIT2: RegistryEvent或从其派生的类(例如RegistryValueChangeEvent不支持对HKEY_CLASSES_ROOT和HKEY_CURRENT_USER配置单元的更改。 ( MSDN )

如何在注册表项中搜索特定值

如何在注册表项中搜索特定值? 例如,我想在中搜索XXX HKEY_CLASSES_ROOT\Installer\Products C#中的任何代码示例都将受到赞赏, 谢谢

在VBA中对C#COM库进行早期绑定

虽然这是一个很长的问题,但编码和测试部分应该很容易重现。 我在C#创建了两个单独的Class Libraries ,我认为我遇到了由我以前的项目和试验中的现有注册表项引起的名称冲突问题。 这是我的两个class级: using System; using System.Runtime.InteropServices; namespace Test { [InterfaceType(ComInterfaceType.InterfaceIsDual), Guid(“ED5D264B-1D80-4A5D-9C14-8297D90B7037”)] public interface ITest { // body } [ClassInterface(ClassInterfaceType.None)] [Guid(“8B261B92-8EC5-4CDC-A551-67DEB42137FF”)] [ProgId(“Test.TestClass”)] public class TestClass : ITest { // body } } 和 using System; using System.Runtime.InteropServices; using ADODB; namespace Test { [InterfaceType(ComInterfaceType.InterfaceIsDual), Guid(“ED5D264B-1D80-4A5D-9C14-8297D90B7037”)] public interface IConnection { // body } [ClassInterface(ClassInterfaceType.None)] [Guid(“8B261B92-8EC5-4CDC-A551-67DEB42137FF”)] […]

保存应用程序首选项…注册表/文件

存储应用程序首选项的最佳位置在哪里? 特别是,我想保存媒体播放器的首选项,如音量级别等。 两个候选人脑海中浮现……文件和注册表。 哪个更合适? 作为后续内容,我还想知道是否有任何API有助于创建特定于应用程序的设置。 除非有人告诉我这是错误的,否则我想保存HKCU… or HKLM/Software/MyCompanyName/MyAppName/Key注册表的HKCU… or HKLM/Software/MyCompanyName/MyAppName/Key ,或者%APPDATA\MyCompanyName\MyAppName\someTypeOfSettingsFile 。 由于这些似乎常用于此类设置,我假设.Net可以轻松地在这些位置存储设置。 是否有一个简单的高级API,.Net可以让我读取和写入这些常见位置的设置?

从同一应用程序读取和写入x86和x64注册表项

我正在运行编译为x86的应用程序,它运行在64位Windows上。 为了解决ClickOnce文件关联的问题,我想从注册表的x86视图中读取一些CLSID值,然后将它们写入x64视图。 要清楚,这意味着从x86应用程序我想同时从x86注册表视图读取,然后写入x64注册表视图。 我想在HKEY_CURRENT_USER\Software\Classes\CLSID\{my clsid}下找到我找到的值,并将它们写入HKEY_CURRENT_USER\Software\Classes\Wow6432Node\CLSID\{my clsid} 。 我该怎么做? 使用RegistryView会产生意外结果。 例如,此OpenSubKey调用返回null: keyPath = @”Software\Classes\CLSID\” + clsid; var regularx86View = RegistryKey.OpenBaseKey(RegistryHive.CurrentUser, RegistryView.Registry32); var regularClassKey = regularx86View.OpenSubKey(keyPath, RegistryKeyPermissionCheck.ReadSubTree); 如果我使用RegistryView.RegistryDefault或RegistryView.Registry64而不是它返回密钥 – 但我希望它在使用Registry64时返回null,因为该密钥在x64视图中不存在,并且不应该发生重定向。 使用RegistryView正在做的事情,还是我应该直接使用WinAPI?

如何在Windows中覆盖最大32×32鼠标大小,就像这个程序一样

我希望我的程序能够覆盖32×32的最大强制鼠标大小,就像附图中的程序一样,图中的光标是72×72。 这是ProcMon一个捕获,显示了游标更改时发生的情况。 但是,如果我尝试自己更改游标文件的注册表值,然后使用推送更改 SystemParametersInfo(SPI.SPI_SETCURSORS, 0, IntPtr.Zero, SPIF.SPIF_SENDCHANGE); 然后光标会改变,但它仍然限制在32×32的最大尺寸。 这个程序如何能够绕过这个限制? 此外,游标在程序结束后仍然保留,因此它不能在运行时执行,但必须覆盖某处的设置。 感谢您的帮助,我无法在网上找到这样的任何内容,所以我甚至不知道是否有人会得到答案。 编辑:我看到一些名为C:\Windows\SysWOW64\Imageres.dll的文件的访问权限。 它们只是读取,但也许这些游标存储在这里,或者它们以某种方式修改了这个文件。 但我认为它可能会让一个比我更有经验的人走上正轨。 编辑2:我认为尺寸是由SM_CXCURSOR和SM_CYCURSOR变量决定的。 如果我能找到一种方法来设置这些,我可能会做生意。 要编写一个快速程序,在程序运行时使用巨大的鼠标光标在PC上获取这些值,看看它返回的内容…… 编辑3:没有运气; 带有巨大游标的PC为SM_CXCURSOR和SM_CYCURSOR返回32×32。