Adicionar Nomes de Domínio de Terceiro Nível
Aplica-se a: Windows Server Essentials 2016, Windows Server Essentials 2012 R2, Windows Server Essentials 2012
É possível capacitar os usuários para que solicitem nomes de domínio de terceiro nível no Assistente de Configuração de Nome de Domínio. Isso é feito com a criação e a instalação de um assembly de código usado pelo Gerenciador de Domínio no sistema operacional.
Criar um provedor de nomes de domínio de terceiro nível
Você pode tornar disponíveis os nomes de domínio de terceiro nível criando e instalando um assembly de código que fornece os nomes de domínio para o assistente. Para fazer isso, conclua as seguintes tarefas:
Adicionar uma implementação da interface IDomainSignupProvider ao assembly
Adicionar uma implementação da interface IDomainMaintenanceProvider ao assembly
Reiniciar o serviço Gerenciamento de Nome de Domínio do Windows Server
Adicionar uma implementação da interface IDomainSignupProvider ao assembly
A interface IDomainSignupProvider é usada para adicionar as ofertas de domínio ao assistente.
Para adicionar o código de IDomainSignupProvider ao assembly
Abra o Visual Studio 2008 como administrador clicando com o botão direito do mouse no programa, no menu Iniciar e selecione Executar como administrador.
Clique em Arquivo, em Novo e em Projeto.
Na caixa de diálogo Novo Projeto, clique em Visual C#; clique em Biblioteca de Classes, digite um nome para a solução e clique em OK.
Renomeie o arquivo Class1.cs. Por exemplo, MyDomainNameProvider.cs
Adicione referências aos arquivos Wssg.Web.DomainManagerObjectModel.dll, CertManaged.dll, WssgCertMgmt.dll e WssgCommon.dll.
Adicionar as seguintes instruções de uso.
using System.Collections.ObjectModel; using System.Net; using System.Net.Sockets; using Microsoft.WindowsServerSolutions.Certificates; using Microsoft.WindowsServerSolutions.CertificateManagement; using Microsoft.WindowsServerSolutions.Common; using Microsoft.Win32;
Altere o namespace e o cabeçalho de classe para corresponder ao exemplo a seguir.
namespace Microsoft.WindowsServerSolutions.RemoteAccess.Domains { public class MyDomainNameProvider : IDomainSignupProvider { } }
Adicione o método Initialize e as variáveis exigidas para a classe, que define as ofertas apresentadas no assistente.
Observação
O método Initialize define um identificador para o provedor de domínio que deve ser exclusivo. Uma forma comum de fazer isso é definir um GUID como identificador. Para obter mais informações sobre como criar uma GUID, consulte Criar Guid (guidgen.exe).
O exemplo de código a seguir mostra o método Initialize.
static readonly Guid MyID = new Guid("8C999DF5-696A-47af-822D-94F1673D3397"); public Guid ID { get { return MyID; } } public string Name { get { return "My Provider"; } } List<Offering> offerings = new List<Offering>(); public void Initialize(DomainProviderSettings config) { var offer1 = new Offering() { Description = "My Domain Provider", Name = "Offering 1", ProviderID = ID, MoreInfoUrl = new Uri("http://www.contoso.com"), MembershipServiceName = "My Membership", EulaUrl = new Uri("http://www.contoso.com"), }; this.offerings.Add(offer1); RegistryKey key = Registry.LocalMachine.CreateSubKey(@"Software\Microsoft\Windows Server\Domain Manager\Settings"); key.Close(); }
Adicione o método GetOfferings, que retorna a lista de ofertas inicializada na etapa anterior. O exemplo de código a seguir mostra o método GetOfferings.
public ReadOnlyCollection<Offering> GetOfferings() { return this.offerings.AsReadOnly(); }
Adicione o método FindOfferingForDomain, que retorna a oferta da lista. O exemplo de código a seguir mostra o método FindOfferingForDomain.
public Offering FindOfferingForDomain(string domain) { // Return the offering that has the domain name. return offerings[0]; }
Adicione o método SetCredentials, que define as credenciais exigidas para o acesso às ofertas. O exemplo de código a seguir mostra o método SetCredentials.
private string currentUser { get; set; } private string currentPassword { get; set; } public bool SetCredentials(DomainNameRequest request, DomainProviderCredentials credentials, bool validate) { currentUser = credentials.UserName; currentPassword = credentials.Password; if (validate) { return ValidateCredentials(); } return true; }
Adicione o método ValidateCredentials, que valida as credenciais definidas pelo SetCredentials. O exemplo de código a seguir mostra o método ValidateCredentials.
public static readonly string offerUser = "user1@contoso.com"; public static readonly string offerPassword = "password1"; public bool ValidateCredentials() { if (IsUser()) return string.Equals(currentPassword, offerPassword); else return false; } private bool IsUser() { return string.Equals(currentUser, offerUser, StringComparison.OrdinalIgnoreCase); }
Adicione o método GetAvailableDomainRoots, que retorna a lista de nomes de domínio raiz suportados pela oferta especificada na solicitação. Esta lista de nomes de domínio raiz não deve estar vazia. O exemplo de código a seguir mostra o método GetAvailableDomainRoots.
public ReadOnlyCollection<string> GetAvailableDomainRoots(DomainNameRequest request) { List<string> list = new List<string>(); list.Add("domain1.com"); list.Add("domain1.org"); return list.AsReadOnly(); }
Adicione o método GetUserDomainNames, que retorna uma lista de nomes de domínio já possuída pelo usuário atual, relativa à oferta corrente. Essa lista pode estar vazia. O exemplo de código a seguir mostra o método GetUserDomainNames.
public static readonly string AvailableDomain1 = "available.domain1.com", AvailableDomain2 = "available.domain2.com"; public static readonly string OccupiedDomain1 = "occupied.domain1.com", OccupiedDomain2 = "occupied.domain2.com"; public ReadOnlyCollection<string> GetUserDomainNames(DomainNameRequest request) { var userDomains = new List<string>(); userDomains.Add(OccupiedDomain1); userDomains.Add(AvailableDomain1); return userDomains.AsReadOnly(); }
Adicione o método GetUserDomainQuota, que retorna o número máximo de domínios permitido pela oferta especificada. Se um máximo não se aplicar, esse método deve retornar 0. O exemplo de código a seguir mostra o método GetUserDomainQuota.
public int GetUserDomainQuota(DomainNameRequest request) { return 0; }
Adicione o método CheckDomainAvailability, que verifica a disponibilidade do nome de domínio solicitado e pode retornar uma lista de sugestões. O exemplo de código a seguir mostra o método CheckDomainAvailability .
public bool CheckDomainAvailability(DomainNameRequest request, out ReadOnlyCollection<string> suggestions) { suggestions = null; return true; }
Adicione o método CommitDomain, que confirma o nome de domínio solicitado. A conclusão bem-sucedida desse método indica que o nome de domínio foi associado à conta de usuário. O provedor de manutenção será chamado imediatamente para recuperar o certificado se o estado for FullyOperational, e o provedor e a oferta serão ativados. O exemplo de código a seguir mostra o método CommitDomain.
public DomainStatus CommitDomain(DomainNameRequest request) { ReadOnlyCollection<string> suggestions; if (!CheckDomainAvailability(request, out suggestions)) { throw new DomainException(FailureReason.InvalidDomainName, null, null); } return DomainStatus.Ready; }
Adicione o método ReleaseDomain, que informa ao provedor que o usuário deseja liberar o nome de domínio. O exemplo de código a seguir mostra o método ReleaseDomain.
public bool ReleaseDomain(DomainNameRequest request) { return true; }
Adicione o método GetProviderLandingUrl, que retorna a URL para a página de aterrissagem no fluxo de trabalho de assinatura do domínio. O exemplo de código a seguir mostra o método GetProviderLandingUrl.
public Url GetProviderLandingUrl(DomainNameRequest request) { return new Url("www.contoso.com"); }
Adicione o método GetDomainMaintenanceProvider, que retorna uma instância do IDomainMaintenanceProvider usada para tarefas de manutenção de domínio. Esse método é requisitado após o êxito do método CommitDomain e quando o Gerenciador de Domínio é iniciado. O exemplo de código a seguir mostra o método GetDomainMaintenanceProvider.
public IDomainMaintenanceProvider GetDomainMaintenanceProvider() { return new MyDomainMaintenanceProvider(); }
Salve o projeto, mas não o feche, porque você irá adicionar a ele o próximo procedimento. Você não poderá criar o projeto até que tenha concluído o próximo procedimento.
Adicionar uma implementação da interface IDomainMaintenanceProvider ao assembly
O IDomainMaintenanceProvider é usado para manter o domínio depois que ele é criado.
Para adicionar o código de IDomainMaintenanceProvider ao assembly
Adicione o cabeçalho de classe ao provedor de manutenção do domínio. Certifique-se de que o nome definido para o provedor corresponde ao nome no método GetDomainMaintenanceProvider definido anteriormente.
public class MyDomainMaintenanceProvider : IDomainMaintenanceProvider { }
Adicione o método Activate, que define o provedor ativo. O exemplo de código a seguir mostra o método Activate.
string DomainName { get; set; } protected DomainProviderSettings Settings { get; set; } public void Activate(DomainProviderSettings settings, DomainNameConfiguration config, DomainProviderCredentials credentials) { Settings = settings; SetCredentials(credentials); DomainName = config.AutoConfiguredAnywhereAccessFullName.Punycode; }
Adicione o método Deactivate, que é usado para desativar todas as ações. O exemplo de código a seguir mostra o método Deactivate.
public void Deactivate() { //Deactivate all actions }
Adicione o método SetCredentials, que atualiza as credenciais do usuário. Por exemplo, esse método pode ser requisitado para atualizar credenciais que não são mais válidas. O exemplo de código a seguir mostra o método SetCredentials.
protected DomainProviderCredentials Credentials { get; set; } public bool SetCredentials(DomainProviderCredentials credentials) { this.Credentials = credentials; return true; }
Adicione o método ValidateCredentials, que valida as credenciais especificadas. O exemplo de código a seguir mostra o método ValidateCredentials.
public static readonly string offerUser = "user1@contoso.com"; public static readonly string offerPassword = "password1"; public bool ValidateCredentials() { if (string.Equals(this.Credentials.UserName, offerUser, StringComparison.OrdinalIgnoreCase) && string.Equals(this.Credentials.Password, offerPassword)) return true; return false; }
Adicione o método GetPublicAddress, que retorna o endereço IP externo do servidor. O exemplo de código a seguir mostra o método GetPublicAddress.
public IPAddress GetPublicIPAddress() { string PublicIP = "0.0.0.0"; using (RegistryKey key = ProductInfo.RegKey.OpenSubKey("Domain Manager\\Settings", true)) { PublicIP = (key == null) ? "0.0.0.0" : key.GetValue("PublicIP", "0.0.0.0").ToString(); } IPAddress ip = IPAddress.Parse(PublicIP); if (PublicIP == "0.0.0.0") { string strHostName = Dns.GetHostName(); IPHostEntry ipEntry = Dns.GetHostEntry(strHostName); IPAddress[] addr = ipEntry.AddressList; foreach (IPAddress add in addr) { if (add.AddressFamily == AddressFamily.InterNetwork) { return add; } } } else { return IPAddress.Parse(PublicIP); } return null; }
Adicione o método SubmitCertificateRequest, que envia a solicitação de certificado para o nome de domínio configurado atualmente.
string cert=null; public void SubmitCertificateRequest(string certificateRequest) { cert = CertManaged.SubmitRequest(certificateRequest, CertCommon.CAServerFQDN + "\\" + CertCommon.CAName, Microsoft.WindowsServerSolutions.CertificateManagement.CRFlags.Base64Header, CertCommon.CATemplate, EncodingFlags.Base64); }
Adicione o método GetCertificateResponse, que retorna a resposta do certificado se o status do domínio for FullyOperational. Esse método é requisitado para as solicitações de novo certificado e de renovação de certificado. O exemplo de código a seguir mostra o método GetCertificateResponse.
public string GetCertificateResponse(bool renew) { return cert; }
Adicione o método SubmitRenewCertificateRequest, que processa a renovação do certificado. O exemplo de código a seguir mostra o método SubmitRenewCertificateRequest.
public void SubmitRenewCertificateRequest() { // Add certificate renewal code }
Adicione o método UpdateDNSRecords, que atualiza os registros DNS armazenados pelo provedor. O exemplo de código a seguir mostra o método UpdateDNS.
public bool UpdateDnsRecords(IList<DnsRecord> records) { string UpdateDNS = "true"; using (RegistryKey key = ProductInfo.RegKey.OpenSubKey("Domain Manager\\Settings", true)) { UpdateDNS = (key == null) ? "true" : key.GetValue("UpdateDNS", "true").ToString(); } return UpdateDNS == "true"; }
Adicione o método TestConnection, que tenta estabelecer uma conexão com serviço de back-end. Se esse método exigir autenticação, uma exceção apropriada deverá ser lançada. O exemplo de código a seguir mostra o método TestConnection.
public bool TestConnection() { // Add code to test connection return true; }
Adicione o método GetDomainState, que retorna o estado atual do domínio. O exemplo de código a seguir mostra o método GetDomainState.
public DomainState GetDomainState() { string domainstatus = "FullyOperational"; long expirationDate = 365; using (RegistryKey key = ProductInfo.RegKey.OpenSubKey("Domain Manager\\Settings", true)) { domainstatus = (key == null) ? "Ready" : key.GetValue("DomainStatus", "Ready").ToString(); expirationDate = Int64.Parse(key.GetValue("ExpirationDate", "365").ToString()); } switch (domainstatus) { case "Failed": return new DomainState(DomainStatus.Failed, null, DateTime.Now.AddDays(expirationDate)); case "Ready": return new DomainState(DomainStatus.Ready, null, DateTime.Now.AddDays(expirationDate)); case "InRenewal": return new DomainState(DomainStatus.InRenewal, null, DateTime.Now.AddDays(expirationDate)); case "InRenewalCustomerInterventionRequired": return new DomainState(DomainStatus.InRenewalCustomerInterventionRequired, null, DateTime.Now.AddDays(expirationDate)); case "Pending": return new DomainState(DomainStatus.Pending, null, DateTime.Now.AddDays(expirationDate)); case "PendingCustomerInterventionRequired": return new DomainState(DomainStatus.PendingCustomerInterventionRequired, null, DateTime.Now.AddDays(expirationDate)); case "RenewalFailed": return new DomainState(DomainStatus.RenewalFailed, null, DateTime.Now.AddDays(expirationDate)); default: return new DomainState(DomainStatus.Unknown, null, DateTime.Now.AddDays(expirationDate)); } }
Adicione o método GetCertificateState, que retorna o estado atual do certificado. O exemplo de código a seguir mostra o método GetCertificateState.
public CertificateState GetCertificateState(bool renew) { return new CertificateState(CertificateStatus.Ready, string.Empty); }
Salve e crie a solução.
Assinar o assembly com uma assinatura Authenticode
Você deve assinar com a Authenticode o assembly para que seja usado no sistema operacional. Para obter mais informações sobre a assinatura do assembly, consulte Assinando e verificando códigos com Authenticode.
Instalar o assembly no computador de referência
Coloque o assembly em uma pasta no computador de referência. Anote o caminho da pasta, porque ele será informado no Registro na próxima etapa.
Adicione uma chave ao Registro
Uma entrada de registro é adicionada para definir as características e a localização do assembly.
Para adicionar uma chave ao Registro
No computador de referência, clique em Iniciar, digite regedit e pressione Enter.
No painel esquerdo, expanda HKEY_LOCAL_MACHINE, expanda SOFTWARE, expanda Microsoft, expanda Windows Server, expanda Gerenciadores de Domínio e, finalmente, expanda Provedores.
Clique com o botão direito do mouse em Provedores, aponte para Novo e clique em Chave.
Digite o identificador do provedor como o nome da chave. O identificador é o GUID definido para o provedor na etapa 8 de Adicionar uma implementação da interface IDomainSignupProvider ao assembly.
Clique com o botão direito do mouse na chave que você acabou de criar e, em seguida, clique em Valor da Cadeia de Caracteres.
Digite Assembly para o nome da cadeia de caracteres e pressione Enter.
Clique com o botão direito do mouse na nova cadeia de caracteres do Assembly no painel à direita e clique em Modificar.
Digite o caminho completo para o arquivo do assembly criado anteriormente e clique em OK.
Clique com o botão direito novamente na chave e, em seguida, clique em Valor da Cadeia de Caracteres.
Digite Habilitado para o nome da cadeia de caracteres e pressione Enter.
Clique com o botão direito na nova cadeia de caracteres Enabled no painel à direita e, em seguida, clique em Modificar.
Digite True e, em seguida, clique em OK.
Clique com o botão direito novamente na chave e, em seguida, clique em Valor da Cadeia de Caracteres.
Digite Tipo para o nome da cadeia de caracteres e pressione Enter.
Clique com o botão direito na nova cadeia de caracteres Type no painel à direita e clique em Modificar.
Digite o nome completo da classe do provedor definida no assembly e clique em OK.
Reiniciar o serviço Gerenciamento de Nome de Domínio do Windows Server
É preciso reiniciar o serviço Gerenciamento de Domínio do Windows Server para que o provedor se torne disponível para o sistema operacional.
Reinicie o serviço.
Clique em Iniciar, digite mmc e pressione Enter.
Se o snap-in Serviços não estiver listado no console, adicione-o executando as seguintes etapas:
Clique em Arquivo e em Adicionar/Remover Snap-in.
Na lista Snap-ins disponíveis, clique em Serviços e em Adicionar.
Na caixa de diálogo Serviços, certifique-se de que computador local esteja selecionado e clique em Concluir.
Clique em OK para fechar a caixa de diálogo Adicionar/Remover snap-ins.
Clique com o botão direito do mouse em Serviços, role para baixo, selecione Gerenciamento de Domínio do Windows Server e, a seguir, clique em Reiniciar o serviço.
Consulte Também
Criar e personalizar a imagemPersonalizações adicionaisPreparar a imagem para a implantaçãoTestar a experiência do cliente