.NET 4.x Запись в реестр под другим пользователем - C#
Формулировка задачи:
Вечер добрый .
Помогите друзья , ситуация такая :
В проекте случилась такая проблема столкнулись с ограничением прав у пользователя. Скажем так любое действие пользователя ограничено , но есть необходимость записать данные в реестр , есть учетная запись с админскими правами. Подключиться под админом проделать запись в реестр и отключится. Или еще какие методы есть ?
Есть ли есть варианты желательно с кодом друзья.
Решение задачи: «.NET 4.x Запись в реестр под другим пользователем»
textual
Листинг программы
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Runtime.InteropServices; using System.Security.Principal; namespace Impersonation { class Iimpersonation { private const int LOGON32_LOGON_INTERACTIVE = 2; private const int LOGON32_LOGON_NETWORK_CLEARTEXT = 3; private const int LOGON32_PROVIDER_DEFAULT = 0; [DllImport("advapi32.dll", CharSet = CharSet.Auto)] static extern int LogonUser(string lpszUserName, string lpszDomain, string lpszPassword, int dwLogonType, int dwLogonProvider, ref IntPtr phToken); [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)] static extern int DuplicateToken(IntPtr hToken, int impersonationLevel, ref IntPtr hNewToken); [STAThread] static void Main(string[] args) { // Печатаем текущего пользователя WindowsIdentity wi = WindowsIdentity.GetCurrent(); Console.WriteLine("Name1=>{0} -->{1} domain: {2}", wi.Name, wi.IsAuthenticated, Environment.MachineName); Console.ReadKey(); string UserName = "123"; string Password = "123"; //Для сохранения текущей персонации WindowsImpersonationContext impersonationContex = null; try { //Имперсонируем другого пользователя WindowsIdentity newIdentity; IntPtr token = IntPtr.Zero; IntPtr tokenDuplicate = IntPtr.Zero; if(LogonUser(UserName,Environment.MachineName,Password, LOGON32_LOGON_NETWORK_CLEARTEXT, LOGON32_PROVIDER_DEFAULT,ref token)!= 0) { if(DuplicateToken(token,2,ref tokenDuplicate) != 0) { newIdentity = new WindowsIdentity(tokenDuplicate); //При иперсонации возвращается текущее значение impersonationContex = newIdentity.Impersonate(); } } Console.ReadKey(); } catch(Exception ex) { Console.WriteLine("Ошибка персонации {0} : {1}", UserName, ex.Message); } // Новая персонация WindowsIdentity wi1 = WindowsIdentity.GetCurrent(); Console.WriteLine("Name2=>{0} -->{1}", wi1.Name, wi1.IsAuthenticated); Console.ReadKey(); // Возвращаем предыдущую имперсонацию if (impersonationContex != null) impersonationContex.Undo(); // Печатаем снова WindowsIdentity wi2 = WindowsIdentity.GetCurrent(); Console.WriteLine("Name3=>{0} -->{1}", wi2.Name, wi2.IsAuthenticated); Console.ReadKey(); } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д