Aggiunta programmatica di siti attendibili a Internet Explorer

Sto facendo un progetto di automazione IE usando WatiN.

Quando si fa clic su un file da scaricare, viene visualizzato quanto segue nella barra delle informazioni di Internet Explorer:

Per proteggere la tua sicurezza, Internet Explorer ha bloccato questo sito dal download di file sul tuo computer.

Per scaricare il report, posso aggiungere manualmente il sito all’elenco di siti attendibili di Internet Explorer, ma preferirei controllare a livello di programmazione in .NET per vedere se il sito è attendibile e aggiungerlo all’elenco se non lo è.

Per la cronaca, attualmente sto usando IE7.

    Dai un’occhiata a questo

    Fondamentalmente sembra che tutto ciò che devi fare è creare la chiave di registro

    HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\ZoneMap\Domains\DOMAINNAME 

    quindi un valore REG_DWORD denominato “http” con valore == 2

    Ecco l’implementazione che mi è venuta in mente per scrivere le chiavi di registro in .NET.

    Grazie per avermi messo nella giusta direzione, Ben.

     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 { {"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 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; } } } 

    Sono contento di aver trovato i tuoi messaggi. L’unica cosa che posso aggiungere agli eccellenti contributi è che viene utilizzata una chiave di registro diversa ogni volta che l’URI contiene un indirizzo IP, ovvero l’indirizzo non è un nome di dominio completo.

    In questo caso devi usare un approccio alternativo:

    Immagina di voler aggiungere un indirizzo IP ai siti fidati: ad esempio 10.0.1.13 e non mi interessa quale protocollo.

    Sotto HKEY_CURRENT_USER \ Software \ Microsoft \ Windows \ CurrentVersion \ Internet Settings \ ZoneMap \ Ranges, creo una chiave, ad esempio “Range1” e l’interno che crea i seguenti valori:

    Un DWORD con nome “*” e valore 0x2 (per tutti i protocolli (*) e sito attendibile (2)) Una stringa con nome “: Range” con valore “10.0.1.13”

    Oltre ad aggiungere il dominio all’elenco dei siti attendibili , potrebbe essere necessario modificare l’impostazione “Richiedi automaticamente download di file” per l’area Siti attendibili. Per farlo in modo programmatico, modifichi la chiave / il valore:

    HKCU \ Software \ Microsoft \ Windows \ CurrentVersion \ Impostazioni Internet \ Zone \ 2 @ 2200

    Cambia il valore da 3 (Disabilita) a 0 (Abilita). Ecco un codice C # per farlo:

     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); } } 

    Ecco l’implementazione dell’aggiunta programmata di siti attendibili a IE, basata sul codice di Even Mien. Supporta anche il nome di dominio e l’indirizzo IP. La limitazione non è un protocollo specifico potrebbe essere definito, invece utilizza semplicemente “*” per tutti i protocolli.

     // 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); } } 

    Usando PowerShell è abbastanza facile.

     #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 

    Se un sito web potesse aggiungersi ai siti fidati, ora sarebbe male.

    Non sono del tutto d’accordo: se il browser richiede l’authorization all’utente, la capacità di un sito di aggiungersi ai siti attendibili può semplificare notevolmente l’esperienza dell’utente, laddove l’utente si fida del dominio e desidera visualizzare correttamente la pagina.

    L’alternativa è che l’utente debba andare manualmente nelle opzioni internet per aggiungere il dominio, che è, per i miei utenti, non praticabile.

    sto cercando un metodo php o javascript per il sito da aggiungere, sia attraverso alcuni API di IE, o attraverso il registro come hai spiegato così utile sopra!

    ho trovato finora queste soluzioni possibili:

    • php via shell
    • altri non mi è permesso elencare qui perché non ho abbastanza punti