Você está offline; aguardando reconexão

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

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.
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:

Aviso: Este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 814463 - Última Revisão: 03/22/2007 11:28:33 - Revisão: 1.5

Microsoft SQL Server 2000 Desktop Engine (Windows)

  • kbmt kbsetup kbsecurity kblogin kbauthentication kbsample kbguidelines kbcode kbinfo KB814463 KbMtpt
Comentários