Cómo especificar una contraseña de SA segura al instalar SQL Server 2000 Desktop Engine (MSDE 2000)

Seleccione idioma Seleccione idioma
Id. de artículo: 814463 - Ver los productos a los que se aplica este artículo
Expandir todo | Contraer todo

Resumen

En este artículo describe cómo especificar una contraseña de sa segura cuando instala SQL Server Desktop Engine (también conocido como MSDE 2000).

Más información

Debe asignar una contraseña segura a la cuenta sa durante la instalación de cualquier instancia de SQL Server 2000 Desktop Engine (MSDE 2000). Debe hacerlo incluso si la instancia utiliza el modo de autenticación de Windows. La cuenta sa no se puede usar cualquier usuario cuando se ejecuta en el modo de autenticación de Windows; sin embargo, la instancia más adelante se puede cambiar a modo mixto y la cuenta sa se convierte en un inicio de sesión activa.

Si la cuenta de sa tiene una contraseña en blanco, simple o conocido de null, cuando una instancia de MSDE 2000 se cambia a modo mixto, la instancia de MSDE puede obtener acceso a continuación, a los usuarios no autorizados. No se puede quitar la cuenta sa , y siempre debe protegerse con una contraseña segura para ayudar a restringir el acceso no autorizado a. Cualquier usuario que obtiene acceso a una instancia de MSDE 2000 mediante la cuenta sa , podría obtener control total en esa instancia de MSDE y tienen acceso a los recursos que la cuenta del servicio MSDE tiene la capacidad. De forma predeterminada, la cuenta de servicio MSDE es la cuenta de seguridad integrada LocalSystem .

Para obtener más información acerca de contraseñas seguras, visite el siguiente sitio Web de Microsoft:

Security Rules

Puede utilizar el código de aplicación personalizada para instalar MSDE. El código de la aplicación debe utilizar uno de los dos métodos siguientes para establecer la contraseña de sa :
  • Si el usuario va a configurar MSDE en modo mixto y va a utilizar la cuenta de sa , solicitar una contraseña segura para la cuenta sa del usuario. Utilizar esa contraseña en el MSDE el programa de instalación.
  • Si no se utiliza la cuenta sa , generar una cadena aleatoria y, a continuación, pasar esa cadena como la contraseña de sa a la instalación de MSDE.

Para ayudar a mejorar la seguridad, no debe codificar la contraseña de sa asignada durante la instalación como un parámetro en un archivo Setup.ini, o como un símbolo modificador en un archivo de comandos (.cmd) o incluir como una propiedad en un archivo MSI, o en cualquier otra manera que puede exponer la contraseña como texto sin formato. La contraseña se debe generar dinámicamente un programa de instalación de aplicación en tiempo de ejecución y se debe pasar al proceso de instalación MSDE de las maneras siguientes:
  • Ejecute el archivo setup.exe MSDE desde el código de configuración de la aplicación y especifique un valor SAPWD en los argumentos.

    Por ejemplo, ejecutar el programa de instalación mediante la clase de .NET Framework proceso y a continuación, especifique SAPWD en la propiedad Argumentos de ProcessStartInfo , o ejecutar el programa de instalación mediante la función CreateProcess de Win32 y a continuación, especificar SAPWD en el parámetro lpCommandLine .


    Para obtener más información acerca del parámetro de línea de comandos SAPWD, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
    810826Nuevos modificadores de instalación del Service Pack 2 de MSDE
  • Realizar una acción personalizada para pasar una contraseña segura cuando utiliza los módulos de combinación MSDE en una instalación personalizada Windows_Installer-based.

Nota No puede establecer una contraseña para la cuenta sa durante la instalación de MSDE 2000 mediante Windows modo de autenticación. En este escenario, debe establecer la contraseña una vez finalizada la instalación. Microsoft recomienda encarecidamente que utilice el service pack más reciente para instalar MSDE 2000.

El método que Microsoft recomienda que utilice para generar una contraseña aleatoria es usar las funciones de Crypto API como:
  • CryptAcquireContext
  • CryptGenRandom
  • CryptCreateHash
  • CryptHashData
Si está utilizando código nativo, utilice CryptReleaseContext .

Si estás utilizando código administrado, utilice System.Security.Cryptography.RNGCryptoServiceProvider para obtener una cadena codificada aleatoria y hash, a continuación, el valor que se devuelve mediante el método ComputeHash de la clase System.Security.Cryptography.SHA1 . Cadena aleatoria debe ser de longitud variable, entre 7 y 20 caracteres.

Si olvida la contraseña de sa o no sabe la contraseña de sa y la instancia se convierte en modo mixto, un miembro de la función fija de servidor sysadmin puede restablecer la contraseña de sa sin conocer la contraseña anterior. De forma predeterminada, todos los usuarios miembros del grupo Administradores local son miembros de la función sysadmin . Los miembros de la función sysadmin pueden cambiar una instancia de MSDE de modo de autenticación de Windows a modo mixto o viceversa y pueden cambiar la contraseña de sa . Por lo tanto, por motivos de seguridad, puede que desee quitar el grupo de administradores de sysadmin .

Para obtener más información acerca de cómo se puede quitar el grupo de administradores de la función sysadmin, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
263712Cómo impedir que los administradores de Windows NT de administrar una instancia agrupada de SQL Server


Para obtener más información sobre cambiar la contraseña para el sa cuenta, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
322336Cómo comprobar y cambiar la contraseña de administrador del sistema de MSDE o SQL Server 2005 Express Edition

Nota Los métodos para cambiar la contraseña de sa durante la instalación enumerado en este artículo sólo se aplican a las nuevas instalaciones de MSDE.

Los pasos siguientes utilice código fuente de ejemplo para generar una contraseña de sa aleatorio y, a continuación, iniciar una instalación de MSDE.

Mediante Microsoft Visual C++ .NET

  1. Haga clic en Inicio , seleccione Todos los programas , Visual Studio.NET , Herramientas de Visual Studio .NET y a continuación, haga clic en Visual Studio .NET .
  2. Abra el Bloc de notas.
  3. Pegue el código siguiente en Bloc 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. Guarde el archivo como StrongSA.cpp .
  5. En el símbolo del sistema, escriba el comando siguiente para compilar el código:

    CL strongSA.cpp
  6. En el símbolo del sistema, escriba el siguiente comando para ejecutar el código:

    strongSA.exe

Uso de Microsoft C# .NET

  1. En Visual Studio. NET, cree una nueva Visual C# consola de proyecto de aplicación.
  2. Pegue el código siguiente en el archivo de clase que contiene la función Main.

    Compruebe que el código reemplaza todo el código existente en el sistema 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. Presione F5 para compilar y, a continuación, ejecute el programa.

Referencias

Para obtener más información acerca de cómo incrustar MSDE en una configuración de aplicación personalizada, visite el siguiente sitio Web:
Embedding MSDE 2000 Setup in the Setup of Custom Applications

Propiedades

Id. de artículo: 814463 - Última revisión: jueves, 22 de marzo de 2007 - Versión: 1.5
La información de este artículo se refiere a:
  • Microsoft SQL Server 2000 Desktop Engine (Windows)
Palabras clave: 
kbmt kbsetup kbsecurity kblogin kbauthentication kbsample kbguidelines kbcode kbinfo KB814463 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 814463
Renuncia a responsabilidad de los contenidos de la KB sobre productos a los que ya no se ofrece asistencia alguna
El presente artículo se escribió para productos para los que Microsoft ya no ofrece soporte técnico. Por tanto, el presente artículo se ofrece "tal cual" y no será actualizado.

Enviar comentarios

 

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