วิธีการระบุของอเมริกาใต้รหัสผ่านที่รัดกุมเมื่อคุณติดตั้ง SQL Server 2000 Desktop Engine (MSDE 2000)

การแปลบทความ การแปลบทความ
หมายเลขบทความ (Article ID): 814463
ขยายทั้งหมด | ยุบทั้งหมด

สรุป

บทความนี้อธิบายวิธีการระบุเป็นอย่างแน่นหนาsaรหัสผ่านเมื่อคุณติดตั้งโปรแกรมบนเดสก์ท็อปเซิร์ฟเวอร์ SQL (เรียกอีกอย่างว่า 2000 MSDE)

ข้อมูลเพิ่มเติม

คุณต้องกำหนดรหัสผ่านที่รัดกุมไปsaบัญชีระหว่างการติดตั้งใด ๆ อินสแตนซ์ของ SQL Server 2000 Desktop Engine (MSDE 2000) คุณต้องทำเช่นนี้แม้ว่าอินสแตนซ์ที่กำลังใช้โหมดการพิสูจน์ตัวจริงของ Windows กระบวนการsaบัญชีไม่สามารถใช้ โดยผู้ใช้เมื่อทำงานในโหมดการพิสูจน์ตัวจริงของ Windows การอย่างไรก็ตาม อินสแตนซ์สามารถภายหลังได้ switched ไปยังโหมดผสม และsaบัญชีมี การเข้าสู่ระบบที่ใช้งานอยู่

ถ้าการsaบัญชีมีเป็น null รหัสผ่านที่ว่างเปล่า ปกติ หรือรู้จักกันดีเมื่ออินสแตนซ์ MSDE 2000 คือ switched ไปยังโหมดผสม อินสแตนซ์ MSDE สามารถถูกเข้าถึง โดยผู้ใช้ที่ไม่ได้รับอนุญาตแล้ว กระบวนการsaไม่สามารถถูกส่งน้อยลงบัญชี และจะต้องเสมอได้รับการป้องกัน ด้วยรหัสผ่านที่รัดกุมเพื่อช่วยในการจำกัดการเข้าถึงที่ไม่ได้รับอนุญาต ผู้ใช้ใด ๆ gains เข้ากับอินสแตนซ์ MSDE 2000 โดยใช้การsaบัญชี อาจได้รับการควบคุมทั้งหมดในที่อินสแตนซ์ MSDE และมีความสามารถในการเข้าถึงทรัพยากรที่มีบัญชีบริการ MSDE โดยค่าเริ่มต้น บัญชีบริการ MSDE คือการLocalSystemบัญชีการรักษาความปลอดภัยที่มีอยู่แล้ว

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับรหัสผ่านที่ซับซ้อน แวะไปที่เว็บไซต์ต่อไปนี้ของ Microsoft:

ความปลอดภัยกฎ

คุณสามารถใช้โปรแกรมประยุกต์ที่กำหนดเองรหัสการติดตั้ง MSDE รหัสของโปรแกรมประยุกต์ต้องใช้หนึ่งในสองวิธีต่อไปนี้สำหรับการตั้งค่านี้saรหัสผ่าน::
  • ถ้าผู้ใช้ไปยังตั้งค่า MSDE ในโหมดผสม และเป็นไปใช้ในsaรหัส รหัสผ่านที่รัดกุมสำหรับการร้องขอนี้saบัญชีจากผู้ใช้ ใช้รหัสผ่านนั้นใน MSDE การตั้งค่า
  • ถ้าการsaไม่มีใช้บัญชี สร้างสตริงแบบสุ่ม แล้ว ผ่านสายอักขระที่เป็นsaรหัสผ่านการตั้งค่า MSDE

เพื่อช่วยปรับปรุงการรักษาความปลอดภัย คุณควรไม่ยากรหัสนั้นsaรหัสผ่านที่กำหนดที่การตั้งค่าพารามิเตอร์ในแฟ้ม Setup.ini หรือ เป็นพรอมต์คำสั่งสลับในแฟ้มคำสั่ง (.cmd) หรือรวมเป็นคุณสมบัติ ในแฟ้มของ MSI หรือ ด้วยวิธีอื่นที่สามารถทำให้เกิดการเรียกใช้รหัสผ่านเป็นข้อความล้วน The password should be dynamically generated by an application setup program at run time, and it should be passed to the MSDE setup process in one of the following ways:
  • Run the MSDE setup.exe from the application setup code, and specify a SAPWD value in the arguments.

    For example, run the setup by using the .NET Frameworkกระบวนการclass, and then specify SAPWD in theProcessStartInfo Argumentsproperty, or run the setup by using the Win32CreateProcessfunction, and then specify SAPWD in thelpCommandLineพารามิเตอร์


    For more information about the SAPWD command line parameter, click the following article number to view the article in the Microsoft Knowledge Base:
    810826New switches in MSDE Service Pack 2 Setup
  • Perform a custom action to pass a strong password when you use the MSDE merge modules in a custom Windows Installer-based setup.

หมายเหตุ:You cannot set a password for thesaaccount during the MSDE 2000 setup by using Windows Authentication Mode. In this scenario, you must set the password after the setup completes. Microsoft strongly recommends that you use the latest service pack to install MSDE 2000.

The method that Microsoft recommends you use to generate a random password is to use theCryptoAPI functions such as:
  • CryptAcquireContext
  • CryptGenRandom
  • CryptCreateHash
  • CryptHashData
If you are using native code, useCryptReleaseContext.

If you are using managed code, useSystem.Security.Cryptography.RNGCryptoServiceProviderto obtain a random encoded string, and then hash the value that is returned by using theComputeHashวิธีการนี้System.Security.Cryptography.SHA1คลาสที่ The random string must be of variable length, between 7 and 20 characters.

If you forget thesapassword, or you do not know what thesapassword is, and the instance is converted to Mixed Mode, a member of thesysadminfixed server role can reset thesapassword without knowing the previous password. By default, all users who are members of the local Administrators group are members of thesysadminrole. The members of thesysadminrole can change an MSDE instance from Windows Authentication Mode to Mixed Mode or vice versa, and can change thesapassword. Hence, for security reasons, you may want to remove the Administrators group fromsysadminrole.

For more information about how the Administrators group can be removed from the sysadmin role, click the following article number to view the article in the Microsoft Knowledge Base:
263712How to impede Windows NT administrators from administering a clustered instance of SQL Server


For more information about changing the password for the sa account, click the following article number to view the article in the Microsoft Knowledge Base:
322336วิธีการตรวจสอบ และเปลี่ยนรหัสผ่านผู้ดูแลของระบบใน MSDE หรือ Edition ด่วนของ SQL Server 2005

หมายเหตุ:The methods for changing thesapassword during installation listed in this article only apply to new installations of MSDE.

The following steps use sample source code to generate a randomsapassword, and then start an MSDE installation.

Using Microsoft Visual C++ .NET

  1. คลิกเริ่มการทำงานชี้ไปที่โปรแกรมทั้งหมดชี้ไปที่Microsoft Visual Studio .NETชี้ไปที่Visual Studio .NET Toolsแล้ว คลิกVisual Studio .NET Command Prompt.
  2. Open Notepad.
  3. Paste the following code in 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. บันทึกแฟ้มเป็นStrongSA.cpp.
  5. At the command prompt, type the following command to compile the code:

    cl strongSA.cpp
  6. At the command prompt, type the following command to run the code:

    strongSA.exe

Using Microsoft C#.NET

  1. In Visual Studio .NET, create a new Visual C# Console Application project.
  2. Paste the following code in the class file that contains the Main function.

    Verify that the code replaces all the existing code in the 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. Press F5 to compile, and then run the program.

ข้อมูลอ้างอิง

For more information about how to embed MSDE in a custom application setup, visit the following Microsoft Web site:
Embedding MSDE 2000 Setup in the Setup of Custom Applications

คุณสมบัติ

หมายเลขบทความ (Article ID): 814463 - รีวิวครั้งสุดท้าย: 14 มกราคม 2554 - Revision: 2.0
Keywords: 
kbsetup kbsecurity kblogin kbauthentication kbsample kbguidelines kbcode kbinfo kbmt KB814463 KbMtth
แปลโดยคอมพิวเตอร์
ข้อมูลสำคัญ: บทความนี้แปลโดยซอฟต์แวร์การแปลด้วยคอมพิวเตอร์ของ Microsoft แทนที่จะเป็นนักแปลที่เป็นบุคคล Microsoft มีบทความที่แปลโดยนักแปลและบทความที่แปลด้วยคอมพิวเตอร์ เพื่อให้คุณสามารถเข้าถึงบทความทั้งหมดในฐานความรู้ของเรา ในภาษาของคุณเอง อย่างไรก็ตาม บทความที่แปลด้วยคอมพิวเตอร์นั้นอาจมีข้อบกพร่อง โดยอาจมีข้อผิดพลาดในคำศัพท์ รูปแบบการใช้ภาษาและไวยากรณ์ เช่นเดียวกับกรณีที่ชาวต่างชาติพูดผิดเมื่อพูดภาษาของคุณ Microsoft ไม่มีส่วนรับผิดชอบต่อความคลาดเคลื่อน ความผิดพลาดหรือความเสียหายที่เกิดจากการแปลเนื้อหาผิดพลาด หรือการใช้บทแปลของลูกค้า และ Microsoft มีการปรับปรุงซอฟต์แวร์การแปลด้วยคอมพิวเตอร์อยู่เป็นประจำ
ต่อไปนี้เป็นฉบับภาษาอังกฤษของบทความนี้:814463
การปฏิเสธความรับผิดชอบในเนื้อหาของ KB ที่จะไม่มีการปรับปรุงอีกต่อไป
บทความนี้กล่าวถึงผลิตภัณฑ์ที่ Microsoft ไม่มีการสนับสนุนอีกต่อไป เนื้อหาของบทความจึงมีการนำเสนอ "ตามลักษณะที่เป็น" และจะไม่มีการปรับปรุงข้อมูลอีก

ให้ข้อเสนอแนะ

 

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