Попытка развернуть небольшое приложение, которое вносит изменения в реестр

#c# #visual-studio-2010 #registry

#c# #visual-studio-2010 #реестр

Вопрос:

У меня есть следующая программа, и когда я ее создам (Release config). Оно запускается на моем компьютере разработчика от имени администратора. Однако, когда я запускаю его у конечного пользователя (не администратора), он выходит из строя и говорит что-то о безопасности. Нужно ли мне что-нибудь сделать в свойствах (или в коде), чтобы оно могло маскироваться под администратора

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Win32;

namespace LotusTrustedSites
{       
    class ReportDownloader    
    {        
        [STAThread]        
        static void Main(string[] args)        
        {            
            const string domainsKeyLocation = @"SoftwareMicrosoftWindowsCurrentVersionInternet SettingsZoneMapDomains";            
            const string domain = @"newsite.com";            
            const int trustedSiteZone = 0x2;            
            var subdomains = new Dictionary<string, string>
                {                                     
                    {"www", "https"},                                     
                    {"www", "http"},                                     
                    {"blog", "https"},                                     
                    {"blog", "http"}                                 
                };            
            RegistryKey currentUserKey = Registry.CurrentUser;            
            currentUserKey.GetOrCreateSubKey(domainsKeyLocation, domain, false);            
            foreach (var subdomain in subdomains)            
            {                
                CreateSubdomainKeyAndValue(currentUserKey, domainsKeyLocation, domain, subdomain, trustedSiteZone);            
            }            //automation code        
        }        

        private static void CreateSubdomainKeyAndValue(RegistryKey currentUserKey, string domainsKeyLocation, string domain, KeyValuePair<string, string> subdomain, int zone)        
        {            
            RegistryKey subdomainRegistryKey = currentUserKey.GetOrCreateSubKey(string.Format(@"{0}{1}", domainsKeyLocation, domain), subdomain.Key, true);            
            object objSubDomainValue = subdomainRegistryKey.GetValue(subdomain.Value);            
            if (objSubDomainValue == null || Convert.ToInt32(objSubDomainValue) != zone)            
            {                
                subdomainRegistryKey.SetValue(subdomain.Value, zone, RegistryValueKind.DWord);            
            }        
        }    
    }    
    public static class RegistryKeyExtensionMethods    
    {        
        public static RegistryKey GetOrCreateSubKey(this RegistryKey registryKey, string parentKeyLocation, string key, bool writable)        
        {            
            string keyLocation = string.Format(@"{0}{1}", parentKeyLocation, key);           
            RegistryKey foundRegistryKey = registryKey.OpenSubKey(keyLocation, writable);            
            return foundRegistryKey ?? registryKey.CreateSubKey(parentKeyLocation, key);        
        }        
        public static RegistryKey CreateSubKey(this RegistryKey registryKey, string parentKeyLocation, string key)        
        {            
            RegistryKey parentKey = registryKey.OpenSubKey(parentKeyLocation, true); //must be writable == true            
            if (parentKey == null) 
            { 
                throw new NullReferenceException(string.Format("Missing parent key: {0}", parentKeyLocation)); 
            }            
            RegistryKey createdKey = parentKey.CreateSubKey(key);            
            if (createdKey == null) 
            { 
                throw new Exception(string.Format("Key not created: {0}", key)); 
            }            
            return createdKey;        
        }    
    }
}
  

Комментарии:

1. Если вы не возражаете, что я спрашиваю, что именно вы пытаетесь сделать? SoftwareMicrosoftWindowsCurrentVersionInternet SettingsZoneMapDomains не похоже, что ваше программное обеспечение должно что-либо создавать. Первое, что вы должны спросить себя, если операция не работает при настройках, не связанных с администратором, — это действительно ли вам следует делать то, что вы делаете, или вам следует делать это каким-либо другим способом, например, с настройками приложения в файле .config.

Ответ №1:

Запись в реестр является привилегированной операцией — у вас должны быть правильные разрешения.

Учетная запись, под которой запущено приложение, должна иметь соответствующие разрешения.

Ответ №2:

Создавать настройки реестра программно — это немного неправильная вещь. Проблема заключается в том, что подсистема установщика Windows не может отслеживать эти записи и исправлять их или удалять по мере необходимости. Лучший выбор — использовать файл настроек приложения или предоставить установщик MSI, который создает эти записи для вас.

Комментарии:

1. Я работаю на крупном предприятии, и иногда нам нужно устанавливать приложения через сервер. Однако иногда оно не устанавливается, поэтому нам нужно вручную установить его, а затем настроить. Я бы предпочел исправить небольшое приложение, которое вносит необходимые изменения в реестр, и сделать это в 1 клик.

2. @Cocoa — Вероятно, это одна из причин, по которой каждая корпоративная машина, которая у меня была, работала в 10 раз медленнее, чем аналогичная машина без подключения. В данном случае это не такая уж большая проблема, но это плохая привычка, которая вызывает проблемы, которые можно устранить с помощью механизма установки Windows.

3. @Cocoa — И это не неправильный ответ. Это довольно правильное решение.