Wie Sie ein sicheres SA-Kennwort angeben, bei der Installation von SQL Server 2000 Desktop Engine (MSDE 2000)

SPRACHE AUSWÄHLEN SPRACHE AUSWÄHLEN
Artikel-ID: 814463 - Produkte anzeigen, auf die sich dieser Artikel bezieht
Alles erweitern | Alles schließen

Zusammenfassung

Dieser Artikel beschreibt wie Sie ein sicheres sa -Kennwort angeben, bei der Installation von SQL Server Desktop Engine (MSDE 2000).

Weitere Informationen

Sie müssen das sa -Konto ein sicheres Kennwort während der Installation von einer beliebigen Instanz von SQL Server 2000 Desktop Engine (MSDE 2000) zuordnen. Sie müssen dies tun, auch wenn die Instanz Windows-Authentifizierungsmodus verwendet. Das sa -Konto kann nicht von jedem Benutzer verwendet werden, wenn im Windows-Authentifizierungsmodus ausgeführt; allerdings die Instanz kann später in den gemischten Modus umgestellt werden, und das sa -Konto wird eine aktive Anmeldung.

Wenn das sa -Konto ein Null, leer, bekannten oder einfache Kennwort hat und eine Instanz von MSDE 2000 auf gemischten Modus umgeschaltet wird, kann die MSDE-Instanz anschließend durch nicht autorisierte Benutzer zugegriffen werden. Das sa -Konto kann nicht gelöscht werden, und muss immer mit einem starken Kennwort Einschränken von nicht autorisierten Zugriff geschützt werden. Jeder Benutzer, der Zugriff auf eine Instanz von MSDE 2000 mit das sa -Konto erlangt möglicherweise vollständige Kontrolle für diese Instanz von MSDE und haben die Möglichkeit, sich Ressourcen zugreifen, die das MSDE-Dienstkonto verfügt. Standardmäßig ist das MSDE-Dienstkonto das integrierte Sicherheitskonto LocalSystem .

Weitere Informationen über sichere Kennwörter die folgenden Microsoft-Website:

Security Rules

Sie können benutzerdefinierte Anwendungscode verwenden, um MSDE zu installieren. Der Anwendungscode muss eines der folgenden beiden Methoden verwenden, das sa -Kennwort festlegen:
  • Wenn der Benutzer wird MSDE im gemischten Modus einrichten und verwenden Sie das sa -Konto ist, fordern Sie ein sicheres Kennwort für das sa -Konto vom Benutzer. Verwenden Sie das Kennwort in der MSDE-Setup.
  • Wenn das sa -Konto nicht verwendet wird, eine zufällige Zeichenfolge generiert und übergeben Sie die Zeichenfolge als das sa -Kennwort an der MSDE-Installation.

Zur Verbesserung der Sicherheit sollten Sie nicht hartcodieren das sa -Kennwort bei der Installation als Parameter in eine Datei Setup.ini oder als eine Eingabeaufforderung zugewiesen in einer Befehlsdatei (cmd) wechseln, oder fügen Sie Sie als Eigenschaft in eine MSI-Datei oder andere Weise, die das Kennwort als nur-Text verfügbar machen kann. Das Kennwort sollte dynamisch generiert von einer Setup-Anwendung zur Laufzeit und sollte in eine der folgenden Methoden an den MSDE-Installationsvorgang übergeben werden:
  • Führen Sie die MSDE setup.exe aus dem Anwendungscode Setup, und geben Sie einen Wert SAPWD in den Argumenten.

    Beispielsweise führen Sie Setup mithilfe der .NET Framework- Process -Klasse, dann geben Sie SAPWD in der Eigenschaft ProcessStartInfo Argumente oder führen Sie Setup mithilfe der Win32- CreateProcess -Funktion und geben Sie SAPWD im LpCommandLine Parameter.


    Weitere Informationen zum Parameter Befehlszeile SAPWD finden Sie im folgenden Artikel der Microsoft Knowledge Base:
    810826Neue Schalter in der Installation von MSDE Service Pack 2
  • Führen Sie eine benutzerdefinierte Aktion ein sicheres Kennwort übergeben, wenn Sie die MSDE-Mergemodule in einem benutzerdefinierten Windows_Installer-based Setup verwenden.

Hinweis: Sie können kein Kennwort für das Konto sa während der Installation von MSDE 2000 festlegen, mithilfe von Windows-Authentifizierungsmodus. In diesem Szenario müssen Sie das Kennwort festlegen, nachdem das Setup abgeschlossen ist. Microsoft empfiehlt dringend, dass Sie das neueste Servicepack, verwenden um MSDE 2000 zu installieren.

Die Methode, dass Microsoft Sie verwenden empfiehlt, um ein zufälliges Kennwort generieren ist, die Krypto -API-Funktionen wie z. B. zu verwenden:
  • CryptAcquireContext
  • CryptGenRandom
  • CryptCreateHash
  • CryptHashData
Wenn Sie systemeigenen Code verwenden, verwenden Sie CryptReleaseContext .

Wenn Sie verwalteten Code verwenden, verwenden Sie System.Security.Cryptography.RNGCryptoServiceProvider eine zufällige codierte Zeichenfolge abrufen, und dann den Hashwert, der mithilfe der ComputeHash -Methode der System.Security.Cryptography.SHA1 -Klasse zurückgegeben wird. Zufällige Zeichenfolge muss variabler Länge zwischen 7 und 20 Zeichen lang sein.

Wenn das sa -Kennwort vergessen oder Sie nicht wissen, was das sa -Kennwort ist und die Instanz zu gemischter Modus konvertiert wird, kann ein Mitglied der festen Serverrolle Sysadmin das sa -Kennwort zurücksetzen, ohne das vorherige Kennwort zu kennen. Standardmäßig sind alle Benutzer, die Mitglieder der lokalen Gruppe Administratoren sind Mitglieder der Sysadmin -Rolle. Die Mitglieder der Sysadmin -Rolle können Sie eine MSDE-Instanz von Windows-Authentifizierungsmodus zu gemischter Modus oder umgekehrt ändern und können das sa -Kennwort ändern. Daher kann aus Gründen der Sicherheit der Gruppe "Administratoren" von Sysadmin -Rolle entfernt werden soll.

Informationen dazu, wie die Gruppe Administratoren aus der Sysadmin-Rolle entfernt werden kann finden Sie im folgenden Artikel der Microsoft Knowledge Base:
263712Wie Sie Windows NT-Administratoren aus verwalten eine gruppierte Instanz von SQL Server beeinträchtigen


Weitere Informationen zum Ändern des Kennworts für das sa-Konto, klicken Sie auf die folgende KB-Artikelnummer:
322336Zum Überprüfen und ändern das Kennwort des Systemadministrators in MSDE oder SQL Server 2005 Express Edition

Hinweis: Die Methoden zum Ändern des sa -Kennworts während der Installation in diesem Artikel aufgeführten gelten nur für Neuinstallationen von MSDE.

Die folgenden Schritte Beispielquellcode um ein zufälliges sa -Kennwort zu generieren und dann gestartet eine MSDE-Installation.

Mithilfe von Microsoft Visual C++ .NET

  1. Klicken Sie auf Start , zeigen Sie auf Programme , zeigen Sie auf Microsoft Visual Studio .NET , zeigen Sie auf Visual Studio .NET Tools und klicken Sie dann auf Visual Studio .NET-Eingabeaufforderung .
  2. Öffnen Sie Editor.
  3. Fügen Sie folgenden Code im Editor::
    #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. Speichern Sie die Datei als StrongSA.cpp .
  5. Geben Sie an der Eingabeaufforderung Folgendes um den Code zu kompilieren:

    CL-strongSA.cpp
  6. Geben Sie Folgendes zum Ausführen des Codes, an der Eingabeaufforderung:

    strongSA.exe

Mithilfe von Microsoft C# .NET

  1. Erstellen Sie in Visual Studio .NET eine neue Visual C#-Konsole-Anwendungsprojekt.
  2. Fügen Sie den folgenden Code in der Klassendatei, die die Main-Funktion enthält.

    Stellen Sie sicher, dass der Code den vorhandenen Code in 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. Drücken Sie F5, um kompilieren und führen Sie das Programm.

Informationsquellen

Weitere Informationen zum Einbetten von MSDE in einer benutzerdefinierten Anwendungsinstallation der folgenden Microsoft-Website:
Embedding MSDE 2000 Setup in the Setup of Custom Applications

Eigenschaften

Artikel-ID: 814463 - Geändert am: Donnerstag, 22. März 2007 - Version: 1.5
Die Informationen in diesem Artikel beziehen sich auf:
  • Microsoft SQL Server 2000 Desktop Engine (Windows)
Keywords: 
kbmt kbsetup kbsecurity kblogin kbauthentication kbsample kbguidelines kbcode kbinfo KB814463 KbMtde
Maschinell übersetzter Artikel
Wichtig: Dieser Artikel wurde maschinell und nicht von einem Menschen übersetzt. Die Microsoft Knowledge Base ist sehr umfangreich und ihre Inhalte werden ständig ergänzt beziehungsweise überarbeitet. Um Ihnen dennoch alle Inhalte auf Deutsch anbieten zu können, werden viele Artikel nicht von Menschen, sondern von Übersetzungsprogrammen übersetzt, die kontinuierlich optimiert werden. Doch noch sind maschinell übersetzte Texte in der Regel nicht perfekt, insbesondere hinsichtlich Grammatik und des Einsatzes von Fremdwörtern sowie Fachbegriffen. Microsoft übernimmt keine Gewähr für die sprachliche Qualität oder die technische Richtigkeit der Übersetzungen und ist nicht für Probleme haftbar, die direkt oder indirekt durch Übersetzungsfehler oder die Verwendung der übersetzten Inhalte durch Kunden entstehen könnten.
Den englischen Originalartikel können Sie über folgenden Link abrufen: 814463
Microsoft stellt Ihnen die in der Knowledge Base angebotenen Artikel und Informationen als Service-Leistung zur Verfügung. Microsoft übernimmt keinerlei Gewährleistung dafür, dass die angebotenen Artikel und Informationen auch in Ihrer Einsatzumgebung die erwünschten Ergebnisse erzielen. Die Entscheidung darüber, ob und in welcher Form Sie die angebotenen Artikel und Informationen nutzen, liegt daher allein bei Ihnen. Mit Ausnahme der gesetzlichen Haftung für Vorsatz ist jede Haftung von Microsoft im Zusammenhang mit Ihrer Nutzung dieser Artikel oder Informationen ausgeschlossen.
Disclaimer zu nicht mehr gepflegten KB-Inhalten
Dieser Artikel wurde für Produkte verfasst, für die Microsoft keinen Support mehr anbietet. Der Artikel wird deshalb in der vorliegenden Form bereitgestellt und nicht mehr weiter aktualisiert.

Ihr Feedback an uns

 

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