Cara menentukan SA sandi yang kuat ketika Anda menginstal SQL Server 2000 Desktop mesin (MSDE 2000)

Terjemahan Artikel Terjemahan Artikel
ID Artikel: 814463
Perbesar semua | Perkecil semua

RINGKASAN

Artikel ini menjelaskan cara untuk menentukan yang kuat sa sandi ketika Anda menginstal mesin Desktop SQL Server (juga dikenal sebagai MSDE 2000).

INFORMASI LEBIH LANJUT

Anda harus menetapkan sandi yang kuat untuk sa account selama instalasi setiap contoh SQL Server 2000 Desktop mesin (MSDE 2000). Anda harus melakukannya bahkan jika contoh menggunakan Windows otentikasi Mode. The sa account tidak dapat digunakan oleh setiap pengguna ketika berjalan di Windows Mode otentikasi; Namun, contoh kemudian akan beralih ke modus campuran, dan sa rekening menjadi aktif login.

Jika sa account memiliki password null, kosong, sederhana, atau terkenal ketika contoh MSDE 2000 beralih ke modus campuran, contoh MSDE kemudian dapat diakses oleh pengguna yang tidak sah. The sa akun tidak bisa turun, dan itu harus selalu dilindungi dengan sandi yang kuat untuk membantu membatasi akses yang tidak sah. Setiap pengguna yang memperoleh akses untuk contoh MSDE 2000 dengan menggunakan sa rekening, mungkin mendapatkan kontrol penuh pada contoh dari MSDE, dan memiliki kemampuan untuk mengakses sumber daya yang memiliki account layanan MSDE. Oleh default, account layanan MSDE adalah LocalSystem built-in Keamanan account.

Untuk selengkapnya tentang sandi yang kuat, kunjungi Web site Microsoft berikut:

Keamanan Peraturan

Anda dapat menggunakan kode kustom aplikasi untuk menginstal MSDE. Kode aplikasi harus menggunakan salah satu dari dua metode berikut untuk pengaturan sa sandi:
  • Jika pengguna akan mengatur MSDE dalam modus campuran, dan akan menggunakan sa rekening, sandi yang kuat untuk meminta sa account dari pengguna. Menggunakan sandi di MSDE setup.
  • Jika sa account tidak digunakan, menghasilkan string acak, dan kemudian menyampaikan bahwa string sebagai sa password untuk MSDE setup.

Untuk membantu meningkatkan keamanan, Anda harus tidak keras-kode sa sandi yang diberikan pada konfigurasi sebagai parameter dalam Setup.ini file, atau sebagai prompt perintah beralih dalam file perintah (.cmd), atau memasukkannya sebagai properti di MSI file, atau dengan cara lain yang dapat mengekspos sandi sebagai teks biasa. Password harus dihasilkan secara dinamis oleh aplikasi program penataan pada jangka waktu, dan harus melewati untuk proses penataan MSDE di salah satu cara berikut:
  • Jalankan MSDE setup.exe dari kode setup aplikasi, dan menetapkan nilai SAPWD dalam argumen.

    Misalnya, menjalankan pengaturan oleh menggunakan.NET Framework Proses kelas, dan kemudian tentukan SAPWD di Argumen ProcessStartInfo properti, atau menjalankan setup dengan menggunakan Win32 CreateProcess fungsi, dan kemudian tentukan SAPWD di lpCommandLine parameter.


    Untuk informasi lebih lanjut tentang baris perintah SAPWD parameter, klik nomor artikel di bawah ini untuk melihat artikel di dalam Basis Pengetahuan Microsoft:
    810826Switch baru dalam MSDE Service Pack 2 Setup
  • Melakukan tindakan kustom untuk lulus sandi yang kuat ketika Anda menggunakan MSDE gabungan modul di custom berbasis Penginstal Windows setup.

Catatan Anda tidak dapat menetapkan sandi sa rekening selama penataan MSDE 2000 dengan menggunakan Windows Mode otentikasi. Dalam skenario ini, Anda harus mengatur sandi setelah setup selesai. Microsoft sangat menganjurkan bahwa Anda menggunakan layanan terbaru paket untuk menginstal MSDE 2000.

Metode yang Microsoft menyarankan Anda gunakan untuk menghasilkan acak sandi adalah dengan menggunakan Kripto Fungsi API seperti:
  • CryptAcquireContext
  • CryptGenRandom
  • CryptCreateHash
  • CryptHashData
Jika Anda menggunakan kode asli, menggunakan CryptReleaseContext.

Jika Anda menggunakan kode dikelola, menggunakan System.Security.cryptography.RNGCryptoServiceProvider untuk mendapatkan string dikodekan acak, dan kemudian hash nilai yang kembali dengan menggunakan ComputeHash metode System.Security.cryptography.SHA1 kelas. String acak harus panjang variabel, antara 7 dan 20 karakter.

Jika Anda lupa sa sandi, atau Anda tidak tahu apa sa password, dan contoh dikonversi ke modus campuran, anggota sysadmin peran server tetap dapat me-reset sa sandi tanpa mengetahui password sebelumnya. Secara default, semua pengguna yang merupakan anggota dari grup administrator lokal adalah anggota sysadmin peran. Anggota sysadmin peran dapat mengubah contoh MSDE dari Windows otentikasi Mode ke modus campuran atau sebaliknya, dan dapat mengubah sa sandi. Oleh karena itu, untuk alasan keamanan, Anda dapat menghapus Grup administrator dari sysadmin peran.

Untuk informasi lebih lanjut tentang bagaimana grup Administrator dapat dihapus dari peran sysadmin, klik nomor artikel di bawah ini untuk melihat artikel di dalam Basis Pengetahuan Microsoft:
263712Cara untuk menghalangi Windows NT administrator dari pemberian contoh berkerumun SQL Server


Untuk informasi lebih lanjut tentang mengubah password untuk sa account, klik nomor artikel di bawah ini untuk melihat artikel di dalam Basis Pengetahuan Microsoft:
322336Cara memverifikasi dan mengubah sandi administrator sistem dalam MSDE atau SQL Server 2005 Express Edition

Catatan Metode untuk mengubah sa sandi selama instalasi yang tercantum dalam artikel ini hanya berlaku untuk instalasi baru MSDE.

Langkah-langkah berikut menggunakan kode sumber contoh untuk menghasilkan acak sa password, dan kemudian jalankan instalasi MSDE.

Menggunakan Microsoft Visual C++.NET

  1. Klik Mulai, arahkan ke All Program, arahkan ke Microsoft Visual Studio.NET, Arahkan ke Visual Studio.Alat-alat yang bersih, lalu klikVisual Studio.Prompt Perintah NET.
  2. Buka Notepad.
  3. Paste kode berikut di Notepad::
    #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. Simpan berkas sebagai StrongSA.cpp.
  5. Pada prompt perintah, ketik perintah berikut untuk mengkompilasi kode:

    CL strongSA.cpp
  6. Pada prompt perintah, ketik perintah berikut untuk menjalankan kode:

    strongSA.exe

Menggunakan Microsoft C#.NET

  1. Dalam Visual Studio.NET, membuat baru Visual C# konsol Aplikasi proyek.
  2. Paste kode berikut dalam file kelas yang berisi fungsi utama.

    Memverifikasi bahwa kode menggantikan semua yang ada kode dalam 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. Tekan F5 untuk mengkompilasi dan kemudian menjalankan program.

REFERENSI

Untuk informasi lebih lanjut tentang bagaimana meng-embed MSDE di custom aplikasi setup, kunjungi Web site Microsoft berikut:
Embedding MSDE 2000 Setup dalam Setup kustom dalam aplikasi

Properti

ID Artikel: 814463 - Kajian Terakhir: 03 Oktober 2011 - Revisi: 2.0
Kata kunci: 
kbsetup kbsecurity kblogin kbauthentication kbsample kbguidelines kbcode kbinfo kbmt KB814463 KbMtid
Penerjemahan Mesin
PENTING: Artikel ini diterjemahkan menggunakan perangkat lunak mesin penerjemah Microsoft dan bukan oleh seorang penerjemah. Microsoft menawarkan artikel yang diterjemahkan oleh seorang penerjemah maupun artikel yang diterjemahkan menggunakan mesin sehingga Anda akan memiliki akses ke seluruh artikel baru yang diterbitkan di Pangkalan Pengetahuan (Knowledge Base) dalam bahasa yang Anda gunakan. Namun, artikel yang diterjemahkan menggunakan mesin tidak selalu sempurna. Artikel tersebut mungkin memiliki kesalahan kosa kata, sintaksis, atau tata bahasa, hampir sama seperti orang asing yang berbicara dalam bahasa Anda. Microsoft tidak bertanggung jawab terhadap akurasi, kesalahan atau kerusakan yang disebabkan karena kesalahan penerjemahan konten atau penggunaannya oleh para pelanggan. Microsoft juga sering memperbarui perangkat lunak mesin penerjemah.
Klik disini untuk melihat versi Inggris dari artikel ini:814463
Sanggahan Konten KB yang Tidak Lagi Diperbarui
Artikel ini berisi tentang produk yang tidak lagi didukung oleh Microsoft. Oleh karena itu, artikel ini disajikan ?sebagaimana adanya? dan tidak akan diperbarui.

Berikan Masukan

 

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