Como especificar uma palavra-passe de SA segura quando instalar o SQL Server 2000 Desktop Engine (MSDE 2000)

Traduções de Artigos Traduções de Artigos
Artigo: 814463 - Ver produtos para os quais este artigo se aplica.
Expandir tudo | Reduzir tudo

Sumário

Este artigo descreve como especificar uma palavra-passe de sa segura quando instalar o SQL Server Desktop Engine (também conhecido como MSDE 2000).

Mais Informação

Tem de atribuir uma palavra-passe segura para a conta sa durante a instalação de qualquer instância do SQL Server 2000 Desktop Engine (MSDE 2000). Terá de o fazer mesmo a instância está a utilizar o modo de autenticação do Windows. A conta sa não pode ser utilizada por qualquer utilizador quando a ser executado no modo de autenticação do Windows; no entanto, a instância posteriormente ser mudada para modo misto e a conta sa torna-se um início de sessão activo.

Se a conta sa tiver uma nulo, palavra-em branco, simples ou conhecidos passe quando uma instância do MSDE 2000 é comutada para modo misto, a instância MSDE, em seguida, pode ser acedida por utilizadores não autorizados. Não pode ser largada a conta sa e deve sempre ser protegido com uma palavra-passe segura para ajudar a restringir o acesso não autorizado. Qualquer utilizador que tenha acesso a uma instância do MSDE 2000 utilizando a conta sa , pode obter controlo total sobre essa instância do MSDE e têm a capacidade de aceder a quaisquer recursos com a conta do serviço MSDE. Por predefinição, a conta do serviço MSDE é a conta de segurança incorporado do sistema local .

Para obter mais informações sobre palavras-passe seguras, visite o seguinte Web site da Microsoft:

Security Rules

Pode utilizar o código de aplicativo personalizado para instalar o MSDE. O código da aplicação deve utilizar um dos seguintes dois métodos para definir a palavra-passe do sa :
  • Se o utilizador é vai configurar MSDE no modo misto e está a utilizar a conta sa , pedir uma palavra-passe forte para a conta sa do utilizador. Utilizar essa palavra-passe o MSDE o programa de configuração.
  • Se não for utilizada a conta sa , gerar uma cadeia aleatória e, em seguida, passar dessa cadeia como palavra-passe sa à configuração do MSDE.

Para ajudar a melhorar a segurança, não deverá rígido código palavra-passe sa atribuída ao programa de configuração como um parâmetro num ficheiro Setup.ini ou como uma linha de comandos no ficheiro de comandos (.cmd) ou incluí-lo como uma propriedade num ficheiro MSI ou de outro modo pode expor a palavra-passe como texto simples. A palavra-passe deve ser gerada dinamicamente por um programa de configuração de aplicação em tempo de execução e devem ser passado ao processo de configuração MSDE das formas seguintes:
  • Executar o setup.exe do MSDE a partir do código de programa de configuração da aplicação e especifique um valor SAPWD nos argumentos.

    Por exemplo, execute o programa de configuração utilizando a classe do .NET Framework processo e, em seguida, especifique SAPWD na propriedade ProcessStartInfo argumentos , ou execute o programa de configuração utilizando a função Win32 CreateProcess e, em seguida, especificar SAPWD no parâmetro lpCommandLine .


    Para obter mais informações sobre o parâmetro SAPWD na linha de comandos, clique no número de artigo que se segue para visualizar o artigo na Microsoft Knowledge Base:
    810826Parâmetros de novos no programa de configuração do MSDE Service Pack 2
  • Executa uma acção personalizada para passar uma palavra-passe segura quando utiliza os módulos de intercalação MSDE uma configuração personalizada baseado no Windows Installer.

Nota Não pode definir uma palavra-passe para a conta sa durante a configuração do MSDE 2000 utilizando o Windows modo de autenticação. Neste cenário, tem de definir a palavra-passe depois de concluir a configuração. Microsoft recomenda vivamente que utilize o service pack mais recente para instalar o MSDE 2000.

O método que a Microsoft recomenda que utilize para gerar uma palavra-passe aleatória consiste em utilizar as funções Crypto API como:
  • CryptAcquireContext
  • CryptGenRandom
  • CryptCreateHash
  • CryptHashData
Se estiver a utilizar o código nativo, utilize CryptReleaseContext .

Se estiver a utilizar código gerido, utilize System.Security.Cryptography.RNGCryptoServiceProvider para obter uma cadeia aleatória codificada e, em seguida, o valor que é devolvido utilizando o método ComputeHash da classe System.Security.Cryptography.SHA1 do hash. Cadeia aleatória tem de ser de comprimento variável entre 7 e 20 caracteres.

Se se esquecer a palavra-passe do sa ou não souber o que é a palavra-passe do sa e a instância é convertida para modo misto, o membro da função de servidor fixa sysadmin pode repor a palavra-passe do sa sem saber a palavra-passe anterior. Por predefinição, todos os utilizadores que são membros do grupo de administradores local são membros da função sysadmin . Os membros da função sysadmin podem alterar uma instância do MSDE do modo de autenticação do Windows para modo misto ou vice-versa e podem alterar a palavra-passe do sa . Por conseguinte, por motivos de segurança, poderá 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 de artigo que se segue para visualizar o artigo na Microsoft Knowledge Base:
263712Como impedir os administradores do Windows NT de administrar uma instância do SQL Server em cluster


Para mais informações sobre alterar a palavra-passe para a sa de conta, clique no número de artigo que se segue para visualizar o artigo na base de dados de conhecimento da Microsoft:
322336Como verificar e alterar a palavra-passe de administrador do sistema no MSDE ou SQL Server 2005 Express Edition

Nota Os métodos para alterar a palavra-passe do sa durante a instalação listada neste artigo só se aplicam a novas instalações do MSDE.

Os seguintes passos utilizar código de exemplo para gerar uma palavra-passe de sa aleatória e inicie uma instalação de MSDE.

Utilizando o Microsoft Visual C++ .NET

  1. Clique em Iniciar , aponte para Todos os programas , aponte para Microsoft Visual Studio. NET , aponte para Ferramentas do Visual Studio .NET 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 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. Guarde o ficheiro como StrongSA.cpp .
  5. Na linha de comandos, escreva o seguinte comando para compilar o código:

    strongSA.cpp CL
  6. Na linha de comandos, escreva o seguinte comando para executar o código:

    strongSA.exe

Utilizando o Microsoft C# .NET

  1. No Visual Studio. NET, criar um novo Visual C# consola de projecto de aplicação.
  2. Cole o código seguinte no ficheiro de classe que contém a função principal.

    Verifique se o código substitui todo o código existente no 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. Prima F5 para compilar e, em seguida, execute o programa.

Referências

Para mais informações sobre como incorporar MSDE numa configuração de aplicações personalizadas, visite o seguinte Web site da Microsoft:
Embedding MSDE 2000 Setup in the Setup of Custom Applications

Propriedades

Artigo: 814463 - Última revisão: 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 revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 814463
Exclusão de Responsabilidade para Conteúdo sem Suporte na KB
Este artigo foi escrito sobre produtos para os quais a Microsoft já não fornece suporte. Por conseguinte, este artigo é oferecido "tal como está" e deixará de ser actualizado.

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