Mega Code Archive

 
Categories / C# / Development Class
 

Registry Utils

/*   * ProfileTool  * Copyright 2006-2008 Craig Box  * Released under the Mozilla Public License v1.1  *   * http://www.codeplex.com/ProfileTool  */ using System; using System.Collections; using System.Text; using System.Runtime.InteropServices; using System.Reflection; using Microsoft.Win32; namespace ProfileTool {     class RegistryUtils     {         [StructLayout(LayoutKind.Sequential)]         public struct LUID         {             public int LowPart;             public int HighPart;         }         [StructLayout(LayoutKind.Sequential)]         public struct TOKEN_PRIVILEGES         {             public LUID Luid;             public int Attributes;             public int PrivilegeCount;         }         [DllImport("advapi32.dll", CharSet = CharSet.Auto)]         public static extern int OpenProcessToken(int ProcessHandle, int DesiredAccess,         ref int tokenhandle);         [DllImport("kernel32.dll", CharSet = CharSet.Auto)]         public static extern int GetCurrentProcess();         [DllImport("advapi32.dll", CharSet = CharSet.Auto)]         public static extern int LookupPrivilegeValue(string lpsystemname, string lpname,         [MarshalAs(UnmanagedType.Struct)] ref LUID lpLuid);         [DllImport("advapi32.dll", CharSet = CharSet.Auto)]         public static extern int AdjustTokenPrivileges(int tokenhandle, int disableprivs,         [MarshalAs(UnmanagedType.Struct)]ref TOKEN_PRIVILEGES Newstate, int bufferlength,         int PreivousState, int Returnlength);         [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]         public static extern int RegLoadKey(uint hKey, string lpSubKey, string lpFile);         [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]         public static extern int RegUnLoadKey(uint hKey, string lpSubKey);         public const int TOKEN_ADJUST_PRIVILEGES = 0x00000020;         public const int TOKEN_QUERY = 0x00000008;         public const int SE_PRIVILEGE_ENABLED = 0x00000002;         public const string SE_RESTORE_NAME = "SeRestorePrivilege";         public const string SE_BACKUP_NAME = "SeBackupPrivilege";         public const uint HKEY_USERS = 0x80000003;         public static void PrepareRegLoad()         {             int token = 0;             int retval = 0;             TOKEN_PRIVILEGES TP = new TOKEN_PRIVILEGES();             TOKEN_PRIVILEGES TP2 = new TOKEN_PRIVILEGES();             LUID RestoreLuid = new LUID();             LUID BackupLuid = new LUID();             retval = OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, ref token);             retval = LookupPrivilegeValue(null, SE_RESTORE_NAME, ref RestoreLuid);             retval = LookupPrivilegeValue(null, SE_BACKUP_NAME, ref BackupLuid);             TP.PrivilegeCount = 1;             TP.Attributes = SE_PRIVILEGE_ENABLED;             TP.Luid = RestoreLuid;             TP2.PrivilegeCount = 1;             TP2.Attributes = SE_PRIVILEGE_ENABLED;             TP2.Luid = BackupLuid;             retval = AdjustTokenPrivileges(token, 0, ref TP, 1024, 0, 0);             retval = AdjustTokenPrivileges(token, 0, ref TP2, 1024, 0, 0);         }         // The next two functions are thanks to http://www.rntsoft.com/useritems/RenameRegistryKey.asp                  /// <summary>         /// Copy a registry key.  The parentKey must be writeable.         /// </summary>         /// <param name="parentKey"></param>         /// <param name="keyNameToCopy"></param>         /// <param name="newKeyName"></param>         /// <returns></returns>         public static bool CopyKey(RegistryKey parentKey, string keyNameToCopy, string newKeyName)         {             //Create new key             RegistryKey destinationKey = parentKey.CreateSubKey(newKeyName);             //Open the sourceKey we are copying from             RegistryKey sourceKey = parentKey.OpenSubKey(keyNameToCopy);             RecurseCopyKey(sourceKey, destinationKey);             return true;         }         private static void RecurseCopyKey(RegistryKey sourceKey, RegistryKey destinationKey)         {             //copy all the values             foreach (string valueName in sourceKey.GetValueNames())             {                 object objValue = sourceKey.GetValue(valueName);                 // TODO: .net 1.1 me         //RegistryValueKind valKind = sourceKey.GetValueKind(valueName);                 destinationKey.SetValue(valueName, objValue); //, valKind);             }             //For Each subKey             //Create a new subKey in destinationKey             //Call myself             foreach (string sourceSubKeyName in sourceKey.GetSubKeyNames())             {                 RegistryKey sourceSubKey = sourceKey.OpenSubKey(sourceSubKeyName);                 RegistryKey destSubKey = destinationKey.CreateSubKey(sourceSubKeyName);                 RecurseCopyKey(sourceSubKey, destSubKey);             }         }     /// <summary>     /// Convert a RegistryKey to the IntPtr of its handle.     /// </summary>     /// <param name="registryKey">RegistryKey object</param>     /// <returns>Handle of registry key</returns>     /// http://groups.google.com/group/microsoft.public.dotnet.languages.csharp/browse_thread/thread/335e3a0f3b18fb74/628b8e06319c60ee?lnk=st&q=RegistryKey+to+intPtr&rnum=2&hl=en#628b8e06319c60ee     public static IntPtr GetRegistryHandle(RegistryKey registryKey)     {       Type type = registryKey.GetType();       FieldInfo fieldInfo = type.GetField("hkey", BindingFlags.Instance |         BindingFlags.NonPublic);       return (IntPtr)fieldInfo.GetValue(registryKey);      }     } } /*  * RegistryValueKind.cs - Implementation of the  *      "Microsoft.Win32.RegistryValueKind" class.  *  * Copyright (C) 2004  Southern Storm Software, Pty Ltd.  *  * This program is free software; you can redistribute it and/or modify  * it under the terms of the GNU General Public License as published by  * the Free Software Foundation; either version 2 of the License, or  * (at your option) any later version.  *  * This program is distributed in the hope that it will be useful,  * but WITHOUT ANY WARRANTY; without even the implied warranty of  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the  * GNU General Public License for more details.  *  * You should have received a copy of the GNU General Public License  * along with this program; if not, write to the Free Software  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA  */ namespace Microsoft.Win32 {   public enum RegistryValueKind   {     Unknown      = -1,     String      = 1,     ExpandString  = 2,     Binary      = 3,     DWord      = 4,     MultiString    = 7,     QWord      = 11   }; // enum RegistryValueKind }; // namespace Microsoft.Win32