Como especificar uma senha SA forte quando você instala o SQL Server 2000 Desktop Engine (MSDE 2000)

Traduções deste artigo Traduções deste artigo
ID do artigo: 814463 - Exibir os produtos aos quais esse artigo se aplica.
Expandir tudo | Recolher tudo

Sumário

Este artigo descreve como especificar uma senha sa forte quando você instala o SQL Server Desktop Engine (também conhecido como MSDE 2000).

Mais Informações

Você deve atribuir uma senha de alta segurança para a conta sa durante a instalação de qualquer instância do SQL Server 2000 Desktop Engine (MSDE 2000). Você deve fazer isso mesmo se a instância está usando o Windows Authentication Mode. A conta sa não pode ser usada por qualquer usuário quando executado no modo de autenticação do Windows; no entanto, a instância posteriormente pode ser alternada para o modo misto e um logon ativo torna-se a conta sa .

Se a conta sa tem uma senha em branco, simples ou conhecidos de nulo, quando uma instância do MSDE 2000 é alternada para o modo misto, a instância do MSDE, em seguida, pode ser acessada por usuários não autorizados. A conta sa não pode ser descartada e sempre deve ser protegido com uma senha forte para ajudar a restringir o acesso não autorizado. Qualquer usuário que obtém acesso a uma instância do MSDE 2000 usando a conta sa , pode obter controle total essa instância do MSDE e ter a capacidade de acessar os recursos que possui a conta do serviço MSDE. Por padrão, a conta de serviço MSDE é a conta de segurança interna do sistema local .

Para obter mais informações sobre senhas de alta segurança, visite o seguinte site:

Security Rules

Você pode usar código de aplicativo personalizado para instalar o MSDE. O código do aplicativo deve usar um dos dois métodos a seguir para definir a senha sa :
  • Se o usuário é vai configurar MSDE no modo misto e é pretende usar a conta sa , solicite uma senha forte para a conta sa do usuário. Use essa senha no MSDE a instalação.
  • Se a conta sa não for usada, gerar uma seqüência aleatória e, em seguida, passar essa cadeia de caracteres como a senha sa para a instalação do MSDE.

Para ajudar a melhorar a segurança, você deve não embutir a senha sa atribuída a configuração como um parâmetro em um arquivo Setup.ini, ou como um prompt de comando Alternar em um arquivo de comando (.cmd), ou incluí-lo como uma propriedade em um arquivo MSI ou em qualquer outra forma que pode expor a senha como texto sem formatação. A senha deve ser gerada dinamicamente por um programa de instalação do aplicativo em tempo de execução e devem ser passado para o processo de instalação MSDE das seguintes maneiras:
  • Execute o setup.exe do MSDE do código de programa de instalação de aplicativo e especifique um valor SAPWD nos argumentos.

    Por exemplo, executar a instalação usando a classe do .NET Framework processo e em seguida, especificar SAPWD na propriedade ProcessStartInfo argumentos , ou executar a instalação usando a função Win32 CreateProcess e especificar SAPWD no parâmetro lpCommandLine .


    Para obter mais informações sobre o parâmetro de linha de comando SAPWD, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
    810826Novas opções na instalação do MSDE Service Pack 2
  • Execute uma ação personalizada para passar uma senha forte quando você usar os módulos de mesclagem do MSDE em uma instalação personalizada com base no Windows Installer.

Observação Você não pode definir uma senha para a conta sa durante a instalação do MSDE 2000 usando o Windows Authentication Mode. Nesse cenário, você deve definir a senha após a instalação. Microsoft recomenda que você usar o service pack mais recente para instalar o MSDE 2000.

O método que a Microsoft recomenda que use para gerar uma senha aleatória é usar as funções de criptografia API como:
  • CryptAcquireContext
  • CryptGenRandom
  • CryptCreateHash
  • CryptHashData
Se você estiver usando código nativo, use CryptReleaseContext .

Se você estiver usando código gerenciado, use System.Security.Cryptography.RNGCryptoServiceProvider para obter uma seqüência aleatória codificada e, em seguida, o valor que é retornado, usando o método ComputeHash da classe System.Security.Cryptography.SHA1 de hash. A cadeia de caracteres aleatória deve ser de tamanho variável, entre 20 e 7 caracteres.

Se você esquecer a senha sa , ou você não souber a senha sa e a instância é convertida em modo misto, um membro da função de servidor fixa sysadmin pode redefinir a senha sa sem saber a senha anterior. Por padrão, todos os usuários que são membros do grupo Administradores local são membros da função sysadmin . Os membros da função sysadmin podem alterar uma instância do MSDE de Windows Authentication Mode para modo misto ou vice-versa e podem alterar a senha sa . Portanto, por motivos de segurança, convém remover o grupo de administradores da função sysadmin .

Para obter mais informações sobre como o grupo de administradores pode ser removido da função sysadmin, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
263712Como impedir os administradores do Windows NT de administração de uma instância em cluster do SQL Server


Para obter mais informações sobre alterando a senha para a sa de conta, clique no seguinte número de artigo para ler o artigo na Base de dados de Conhecimento da Microsoft:
322336Como verificar e alterar a senha de administrador do sistema no MSDE ou SQL Server 2005 Express Edition

Observação Os métodos para alterar a senha sa durante a instalação listada neste artigo aplicam-se somente a novas instalações do MSDE.

As etapas a seguir usar exemplos de código fonte para gerar uma senha sa aleatória e inicie uma instalação MSDE.

Usando o Microsoft Visual C++ .NET

  1. Clique em Iniciar , aponte para Todos os programas , aponte para Microsoft Visual Studio. NET , aponte para Visual Studio .NET Tools e, em seguida, clique em Visual Studio .NET Command Prompt .
  2. Abra o bloco de notas.
  3. Cole o seguinte código no bloco de notas:: # pragma
    #pragma once
    
    #define WIN32_LEAN_AND_MEAN		// Exclude rarely-used stuff from Windows headers.
    #define UNICODE
    #include <stdio.h>
    #include <windows.h>
    #include <wincrypt.h>
    
    #ifdef UNICODE
    	#define STRNCPY	wcsncpy
    #else
    	#define STRNCPY strncpy
    #endif
    
    #include <atlenc.h>
    
    #define SAPWDSWITCH _T("SAPWD=")
    #define INSTANCENAME _T("INSTANCENAME=MSDETEST")
    
    
    BOOL GenPwd(TCHAR*, int);
    void DisplayError (DWORD);
    
    int main(void)
    {	
    	//Generate random length for password, between 7 and 20 characters.
    	int nPwdLen = ((rand() % 20) + 7) + 1;	//Extra character for null terminator
    	TCHAR* pPwd = new TCHAR[nPwdLen];
    	UINT uRes = 0;
    	DWORD dwRes = 0;
    	if (!GenPwd(pPwd, nPwdLen))
    	{
    		//Failed to generate a password, log the error and return failure.
    		dwRes = GetLastError();
    		DisplayError(dwRes);
    
    		return dwRes;
    	}
    
    
            STARTUPINFO si;
            PROCESS_INFORMATION pi;
    
            ZeroMemory( &si, sizeof(si) );
            si.cb = sizeof(si);
            ZeroMemory( &pi, sizeof(pi) );
    
    	//Allocate a string for the command line.
    	LPTSTR lpCommand = new TCHAR[nPwdLen + _tcslen(INSTANCENAME) + _tcslen(SAPWDSWITCH) + 2];
    
    	_stprintf(lpCommand, _T("%s %s%s"),INSTANCENAME,  SAPWDSWITCH, pPwd);
    // Specify the complete path of Setup.exe.
    	if (!CreateProcess(_T("setup.exe"), lpCommand, NULL, NULL, FALSE, 
    				0, NULL, NULL, &si, &pi))
    	{
    		dwRes = GetLastError();
    		DisplayError(dwRes);
    	}
    	return 0;
    }
    
    
    //Generates a Random string of length nLen - 1.  Buffer ppwd must allocate an extra character for null terminator.
    //Returns TRUE if successful, FALSE if fails.
    //Extended error information can be obtained from GetLastError().
    BOOL GenPwd(TCHAR* ppwd, int nLen)
    {
    	BOOL bResult = FALSE;	//assume failure
    	HCRYPTPROV hProv = NULL;
    	HCRYPTHASH hHash = NULL;
    	
    	//Storage for random string 4 times longer than the resulting password.
    	DWORD dwBufSize = nLen*4;
    	DWORD dwSize = Base64EncodeGetRequiredLength((int)dwBufSize);
    	LPSTR pEncodedString = NULL;
    	LPBYTE pRandomBuf = NULL;
    	TCHAR* pTRandomPwd = NULL;
    	
    	try
    	{
    		pEncodedString = new char[dwSize];
    		pRandomBuf = new BYTE[dwBufSize];
    		
    		// Try to acquire context to Crypto provider.
    		if (!CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, CRYPT_SILENT))
    		{
    			if (GetLastError() == NTE_BAD_KEYSET) //Test for non-existent keyset
    			{
    				if (!CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, CRYPT_SILENT | CRYPT_NEWKEYSET))
    					throw(GetLastError());
    			}
    			else
    				throw(GetLastError());
    		}
    
    		//Generate a random sequence.
    		if (!CryptGenRandom(hProv, dwBufSize, pRandomBuf))
    		{
    			throw(GetLastError());
    		}
    
    		//Get a handle to a hash, then hash the random stream.
    		if (!CryptCreateHash(hProv, CALG_SHA1, 0, 0, &hHash))
    		{
    			throw(GetLastError());
    		}
    
    		if (!CryptHashData(hHash, pRandomBuf, dwBufSize, NULL))
    		{
    			throw(GetLastError());
    		}
    	
    		//Destroy the hash object.
    		CryptDestroyHash(hHash);
    		//Release Provider context
    		CryptReleaseContext(hProv, 0);	
    	
    		//Encode the hash value to base64.
    		if (!Base64Encode(pRandomBuf, dwBufSize, pEncodedString, (int*) &dwSize, 0))
    		{
    			throw(GetLastError());
    		}
    	
    		//Determine how many tchars you need to convert string to base64.
    		int nTchars = (int) strlen(pEncodedString);
    	
    		pTRandomPwd = new TCHAR[nTchars];
    	
    #ifdef UNICODE
    		if (MultiByteToWideChar(CP_UTF8, 0, pEncodedString, nTchars, pTRandomPwd, nTchars) == 0)
    		{
    			throw(GetLastError());
    		}
    #else
    		STRNCPY( pTRandomPwd, pEncodedString, nLen);
    #endif
    
    		//Copy the first x characters of random string to output buffer.
    		STRNCPY(ppwd, pTRandomPwd, nLen);
    		//Add null terminator to ppwd string.
    		ppwd[nLen] = _T('\0');
    
    		bResult = TRUE;
    
    	}
    	catch (DWORD)
    	{
    		//Set return value to false.
    		bResult = FALSE;
    	}
    	catch (...)
    	{
    		//Unknown error, throw. 
    		throw;
    	}
    
    	//Clean up memory.
    	if (pRandomBuf)
    	{
    		delete pRandomBuf;
    		pRandomBuf = NULL;
    	}
    
    	if (pEncodedString)
    	{
    		delete pEncodedString;
    		pEncodedString = NULL;
    	}
    
    	if (pTRandomPwd)
    	{
    		delete pTRandomPwd;
    		pTRandomPwd = NULL;
    	}
    
    	return bResult;
    }
    
    
    void DisplayError (DWORD dwError)
    {
    	//Resolve the error code to a message string.
    	LPCTSTR MessageBuffer;
    	DWORD dwBufferLength = FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_FROM_SYSTEM,
    		NULL, // module to get message from (NULL == system)
    		dwError,
    		MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language.
    		(LPTSTR) &MessageBuffer,
    		0,
    		NULL
    		);
    
    	DWORD dwBytesWritten;
    	// Output message string on stderr.
    	WriteFile(
    		GetStdHandle(STD_ERROR_HANDLE),
    		MessageBuffer,
    		dwBufferLength,
    		&dwBytesWritten,
    		NULL
    		);
    }
    
  4. Salve o arquivo como StrongSA.cpp .
  5. No prompt de comando, digite o seguinte comando para compilar o código:

    strongSA.cpp CL
  6. No prompt de comando, digite o seguinte comando para executar o código:

    strongSA.exe

Usando o Microsoft .NET translation from VPE for Csharp

  1. No Visual Studio. NET, criar um novo console translation from VPE for Csharp Visual projeto de aplicativo.
  2. Cole o seguinte código no arquivo de classe que contém a função Main.

    Verifique se o código substitui todo o código existente file:
    using System;
    using System.Diagnostics;
    using System.IO;
    using System.Resources;
    using Microsoft.Win32;
    using System.Security.Cryptography;
    
    
    class InstMSDE
    {
    	static void Main(string[] args)
    	{
    		try
    		{   
    			
    
    			// Generate random password.
    			RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
    			byte[] encodedSeed = new byte[512];
    			rng.GetBytes(encodedSeed);
    			SHA1 sha1 = SHA1.Create();
    			byte[] hashval = sha1.ComputeHash(encodedSeed);
    			String base64HashVal = Convert.ToBase64String(hashval);
    			// Trim "=" off the end.
    			base64HashVal = base64HashVal.TrimEnd('=');
    				
    			string msdeINI = "setup.ini";
    
    			// You have to set startInfo parameters values as appropriate for your installation.
    			ProcessStartInfo startInfo = new ProcessStartInfo();
    
    			// Setup.exe for MSDE sp3.
    			startInfo.FileName = "setup.exe"; 
    
    			// Pass the SA password to the setup program.
    			startInfo.Arguments = "/settings \"" + msdeINI + "\"" + " SAPWD=" + base64HashVal + " /qr+ "; 
    			startInfo.WindowStyle = ProcessWindowStyle.Normal;
    			// Substitute the workdir with complete path of installation folder. 
    			startInfo.WorkingDirectory = "c:\\Workingdir";
    				
    			Process.Start(startInfo);
    			
    			
    		}
    		catch (Exception e)
    		{
    			Console.WriteLine("Unable to execute program due to the following error: " + e.Message);
    			return;
    		}  
    	}
    }
    
  3. Pressione F5 para compilar e, em seguida, execute o programa.

Referências

Para obter mais informações sobre como incorporar o MSDE em uma configuração de aplicativo personalizado, visite o seguinte site:
Embedding MSDE 2000 Setup in the Setup of Custom Applications

Propriedades

ID do artigo: 814463 - Última revisão: quinta-feira, 22 de março de 2007 - Revisão: 1.5
A informação contida neste artigo aplica-se a:
  • Microsoft SQL Server 2000 Desktop Engine (Windows)
Palavras-chave: 
kbmt kbsetup kbsecurity kblogin kbauthentication kbsample kbguidelines kbcode kbinfo KB814463 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 814463
Aviso de Isenção de Responsabilidade sobre Conteúdo do KB Aposentado
Este artigo trata de produtos para os quais a Microsoft não mais oferece suporte. Por esta razão, este artigo é oferecido "como está" e não será mais atualizado.

Submeter comentários

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com