Программное добавление надежных сайтов в Internet Explorer
Я делаю проект автоматизации IE с помощью WatiN.
при нажатии на файл для загрузки я получаю следующее в информационной панели Internet Explorer:
чтобы помочь защитить вашу безопасность, Internet Explorer заблокировал это сайт от загрузки файлов к вам компьютер.
чтобы загрузить отчет, я могу вручную добавить сайт в список надежных сайтов Internet Explorer, но я предпочел бы проверить программно в .NET, чтобы увидеть, является ли сайт доверенным и добавить его в список, если это не так.
FYI, в настоящее время я использую IE7.
7 ответов
посмотреть этой
в основном это выглядит так, как будто все, что вам нужно сделать, это создать ключ реестра в
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\ZoneMap\Domains\DOMAINNAME
затем значение REG_DWORD с именем "http" со значением==2
вот реализация, которую я придумал для записи разделов реестра .Сеть.
Спасибо, что направил меня в правильном направлении, Бен.
using System;
using System.Collections.Generic;
using Microsoft.Win32;
namespace ReportManagement
{
    class ReportDownloader
    {
        [STAThread]
        static void Main(string[] args)
        {
            const string domainsKeyLocation = @"Software\Microsoft\Windows\CurrentVersion\Internet Settings\ZoneMap\Domains";
            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;
        }
    }
}
рад, что наткнулся на ваши сообщения. Единственное, что я могу добавить к отличным вкладам, это то, что другой раздел реестра используется всякий раз, когда URI содержит IP-адрес, т. е. адрес не является полным доменным именем.
в этом случае вы должны использовать альтернативный подход:
представьте, что я хочу добавить IP-адрес на надежные сайты: скажем, 10.0.1.13, и мне все равно, какой протокол.
под HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\ZoneMap\Ranges, я создаю ключ, например "Range1" и внутри, которые создают следующие значения:
DWORD с именем " * " и значением 0x2 (для всех протоколов (*) и доверенного сайта (2)) Строка с именем": Range "со значением"10.0.1.13"
кроме добавить домен в список надежных сайтов, вам также может потребоваться изменить параметр "автоматически запрашивать загрузку файлов" для зоны надежных сайтов. Для этого программно измените ключ / значение:
HKCU\Software\Microsoft\Windows\CurrentVersion\интернет Настройки\Зоны\2@2200
изменить значение 3 (отключение) к 0 (включить). Вот некоторые C# код, чтобы сделать что:
public void DisableForTrustedSitesZone()
{
    const string ZonesLocation = @"Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones";
    const int TrustedSiteZone = 2;
    const string AutoPromptForFileDownloadsValueName = @"2200";
    const int AutoPromptForFileDownloadsValueEnable = 0x00;     // Bypass security bar prompt
    using (RegistryKey currentUserKey = Registry.CurrentUser)
    {
        RegistryKey trustedSiteZoneKey = currentUserKey.OpenSubKey(string.Format(@"{0}\{1:d}", ZonesLocation, TrustedSiteZone), true);
        trustedSiteZoneKey.SetValue(AutoPromptForFileDownloadsValueName, AutoPromptForFileDownloadsValueEnable, RegistryValueKind.DWord);
    }
}
вот реализация добавления доверенных сайтов программно в IE на основе кода Even Mien. Он также поддерживает доменное имя и IP-адрес. Ограничение не конкретный протокол может быть определен, вместо этого он просто использует " * " для всех протоколов.
//  Source : http://support.microsoft.com/kb/182569
static class IeTrustedSite
{
    const string DOMAINS_KEY = @"Software\Microsoft\Windows\CurrentVersion\Internet Settings\ZoneMap\Domains";
    const string RANGES_KEY = @"Software\Microsoft\Windows\CurrentVersion\Internet Settings\ZoneMap\Ranges";
    const int TRUSTED_SITE_CODE = 0x2;
    const string ALL_PROTOCOL = "*";
    const string RANGE_ADDRESS = ":Range";
    public static void AddSite(string address)
    {
        string[] segmentList = address.Split(new string[] {"."}, StringSplitOptions.None);
        if (segmentList.Length == 4)
            AddIpAddress(segmentList);
        else
            AddDomainName(segmentList);
    }
    static void AddIpAddress(string[] segmentList)
    {
        string ipAddress = segmentList[0] + "." + segmentList[1] + "." + segmentList[2] + "." + segmentList[3];
        RegistryKey rangeKey = GetRangeKey(ipAddress);
        rangeKey.SetValue(ALL_PROTOCOL, TRUSTED_SITE_CODE, RegistryValueKind.DWord);
        rangeKey.SetValue(RANGE_ADDRESS, ipAddress, RegistryValueKind.String);
    }
    static RegistryKey GetRangeKey(string ipAddress)
    {
        RegistryKey currentUserKey = Registry.CurrentUser;
        for (int i = 1; i < int.MaxValue; i++)
        {
            RegistryKey rangeKey = currentUserKey.GetOrCreateSubKey(RANGES_KEY, "Range" + i.ToString());
            object addressValue = rangeKey.GetValue(RANGE_ADDRESS);
            if (addressValue == null)
            {
                return rangeKey;
            }
            else
            {
                if (Convert.ToString(addressValue) == ipAddress)
                    return rangeKey;
            }
        }
        throw new Exception("No range slot can be used.");
    }
    static void AddDomainName(string[] segmentList)
    {
        if (segmentList.Length == 2)
        {
            AddTwoSegmentDomainName(segmentList);
        }
        else if (segmentList.Length == 3)
        {
            AddThreeSegmentDomainName(segmentList);
        }
        else
        {
            throw new Exception("Un-supported server address.");
        }
    }
    static void AddTwoSegmentDomainName(string[] segmentList)
    {
        RegistryKey currentUserKey = Registry.CurrentUser;
        string domain = segmentList[0] + "." + segmentList[1];
        RegistryKey trustedSiteKey = currentUserKey.GetOrCreateSubKey(DOMAINS_KEY, domain);
        SetDomainNameValue(trustedSiteKey);
    }
    static void AddThreeSegmentDomainName(string[] segmentList)
    {
        RegistryKey currentUserKey = Registry.CurrentUser;
        string domain = segmentList[1] + "." + segmentList[2];
        currentUserKey.GetOrCreateSubKey(DOMAINS_KEY, domain);
        string serviceName = segmentList[0];
        RegistryKey trustedSiteKey = currentUserKey.GetOrCreateSubKey(DOMAINS_KEY + @"\" + domain, serviceName);
        SetDomainNameValue(trustedSiteKey);
    }
    static void SetDomainNameValue(RegistryKey subDomainRegistryKey)
    {
        object securityValue = subDomainRegistryKey.GetValue(ALL_PROTOCOL);
        if (securityValue == null || Convert.ToInt32(securityValue) != TRUSTED_SITE_CODE)
        {
            subDomainRegistryKey.SetValue(ALL_PROTOCOL, TRUSTED_SITE_CODE, RegistryValueKind.DWord);
        }
    }
}
static class RegistryKeyExtension
{
    public static RegistryKey GetOrCreateSubKey(this RegistryKey registryKey, string parentString, string subString)
    {
        RegistryKey subKey = registryKey.OpenSubKey(parentString + @"\" + subString, true);
        if (subKey == null)
            subKey = registryKey.CreateSubKey(parentString, subString);
        return subKey;
    }
    public static RegistryKey CreateSubKey(this RegistryKey registryKey, string parentString, string subString)
    {
        RegistryKey parentKey = registryKey.OpenSubKey(parentString, true);
        if (parentKey == null)
            throw new Exception("BUG : parent key " + parentString + " is not exist."); 
        return parentKey.CreateSubKey(subString);
    }
}
С помощью PowerShell это довольно легко.
#Setting IExplorer settings
Write-Verbose "Now configuring IE"
#Add http://website.com as a trusted Site/Domain
#Navigate to the domains folder in the registry
set-location "HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings"
set-location ZoneMap\Domains
#Create a new folder with the website name
new-item website/ -Force
set-location website/
new-itemproperty . -Name * -Value 2 -Type DWORD -Force
new-itemproperty . -Name http -Value 2 -Type DWORD -Force
new-itemproperty . -Name https -Value 2 -Type DWORD -Force
Если бы веб-сайт мог добавить себя к доверенным сайтам, теперь это было бы плохо.
Я не совсем согласен - пока браузер запрашивает у пользователя разрешение, возможность сайта добавлять себя к доверенным сайтам может значительно упростить пользовательский опыт, когда пользователь доверяет домену и хочет правильного отображения страницы.
альтернативой является то, что пользователь должен вручную перейти в Свойства обозревателя, чтобы добавить домен, который пользователи, не жизнеспособны.
Я ищу php или javascript метод для сайта, чтобы добавить себя, либо через некоторый IE api, или через реестр, как вы так любезно объяснили выше!
нашли эти возможные решения:
- php через shell
- другие я не могу перечислить здесь, потому что у меня недостаточно очков
