Programová změna nativních klientských hesel pro SQL Server

platí pro:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytický platformní systém (PDW)

Important

SQL Server Native Client (SNAC) není dodáván s:

  • SQL Server 2022 (16.x) a novější verze
  • SQL Server Management Studio 19 a novější verze

Pro vývoj nových aplikací se nedoporučuje nativní klient SQL Serveru (SQLNCLI nebo SQLNCLI11) a starší zprostředkovatel Microsoft OLE DB pro SQL Server (SQLOLEDB).

Pro nové projekty použijte jeden z následujících ovladačů:

Informace o SQLNCLI, které se dodává jako součást databázového stroje SQL Serveru (verze 2012 až 2019), naleznete v tomto support lifecycle exception.

Před SQL Server 2005 (9.x) mohl po vypršení uživatelského hesla resetovat pouze administrátor. Od SQL Server 2005 (9.x) podporuje SQL Server Native Client programové zpracování expirace hesel jak prostřednictvím poskytovatele OLE DB pro SQL Server Native Client, tak ovladače SQL Server Native Client ODBC, a také prostřednictvím změn v dialogových oknech SQL Server Login.

Note

Pokud je to možné, vyzvejte uživatele k zadání přihlašovacích údajů za běhu a vyhněte se jejich ukládání v trvalém formátu. Pokud musíte zachovat jejich přihlašovací údaje, měli byste je zašifrovat pomocí kryptografického API Win32. Pro více informací o používání hesel viz Silná hesla.

Chybové kódy přihlášení SQL Server

Pokud nelze spojení navázat kvůli problémům s autentizací, aplikace má k dispozici jeden z následujících chybových kódů SQL Server, který pomůže s diagnostikou a obnovou.

Chybový kód SQL Server Zpráva o chybě
15113 Přihlášení pro uživatele%.*ls' selhalo. Důvod: ověření hesla selhalo. Účet je zablokovaný.
18463 Přihlášení uživatele%.*ls se nezdařilo. Důvod: Změna hesla se nezdařila. Heslo nelze v tuto chvíli použít.
18464 Přihlášení uživatele%.*ls se nezdařilo. Důvod: Změna hesla se nezdařila. Heslo nesplňuje požadavky zásad, protože je příliš krátké.
18465 Přihlášení uživatele%.*ls se nezdařilo. Důvod: Změna hesla se nezdařila. Heslo nesplňuje požadavky politiky, protože je příliš dlouhé.
18466 Přihlášení uživatele%.*ls se nezdařilo. Důvod: Změna hesla se nezdařila. Heslo nesplňuje požadavky zásad, protože není dostatečně složité.
18467 Přihlášení uživatele%.*ls se nezdařilo. Důvod: Změna hesla se nezdařila. Heslo nesplňuje požadavky filtru hesel DLL.
18468 Přihlášení uživatele%.*ls se nezdařilo. Důvod: Změna hesla se nezdařila. Během ověřování hesla došlo k neočekávané chybě.
18487 Přihlášení uživatele%.*ls se nezdařilo. Důvod: Platnost hesla účtu vypršela.
18488 Přihlášení uživatele%.*ls se nezdařilo. Důvod: Heslo účtu se musí změnit.

SQL Server Native Client Zprostředkovatel OLE DB

Poskytovatel SQL Server Native Client OLE DB podporuje vypršení platnosti hesel prostřednictvím uživatelského rozhraní a programovaně.

Vypršení hesla uživatelského rozhraní OLE DB

Provider SQL Server Native Client OLE DB podporuje vypršení platnosti hesel prostřednictvím změn provedených v dialogových oknech SQL Server Login. Pokud je hodnota DBPROP_INIT_PROMPT nastavena na DBPROMPT_NOPROMPT, počáteční pokus o připojení selže, pokud heslo vyprší.

Pokud DBPROP_INIT_PROMPT nastaveno na jinou hodnotu, uživatel vidí SQL Server Login dialog, bez ohledu na to, zda heslo vypršelo nebo ne. Uživatel může kliknout na tlačítko Možnosti a zaškrtnout Změnit heslo pro změnu hesla.

Pokud uživatel klikne na OK a heslo vypršelo, SQL Server ho vyzve k zadání a potvrzení nového hesla pomocí dialogu Změnit heslo SQL Server.

Chování promptů v OLE DB a zamčené účty

Pokusy o připojení mohou selhat kvůli zamčení účtu. Pokud k tomu dojde po zobrazení dialogu SQL Server Login, zobrazí se uživateli chybová zpráva serveru a pokus o připojení je přerušen. Může se také objevit po zobrazení dialogu Změnit heslo SQL Server, pokud uživatel zadá špatnou hodnotu pro staré heslo. V tomto případě se zobrazí stejná chybová zpráva a pokus o připojení je přerušen.

Poolování spojení OLE DB, vypršení hesla a zamčené účty

Účet může být zamčen nebo jeho heslo může vypršet, zatímco je spojení stále aktivní v poolu připojení. Server dvakrát kontroluje vypršená hesla a uzamčené účty. První je, když je spojení poprvé vytvořeno. Podruhé je to při resetu připojení, kdy je spojení odebráno z poolu.

Když pokus o reset selže, spojení je z poolu odstraněno a chyba se vrátí.

Expirace programatického hesla v OLE DB

Poskytovatel SQL Server Native Client OLE DB podporuje vypršení hesla přidáním vlastnosti SSPROP_AUTH_OLD_PASSWORD (typ VT_BSTR), která byla přidána do sady DBPROPSET_SQLSERVERDBINIT vlastností.

Stávající vlastnost "Password" odkazuje na DBPROP_AUTH_PASSWORD a slouží k uložení nového hesla.

Note

V připojovací řetězec vlastnost "Old Password" nastavuje SSPROP_AUTH_OLD_PASSWORD, což je aktuální (možná expirované) heslo, které není dostupné přes vlastnost řetězce poskytovatele.

Poskytovatel neudržuje hodnotu této nemovitosti. Když je tato vlastnost nastavena, poskytovatel nepoužívá pool připojení pro první připojení, protože nastane nové připojení. Pokud je změna hesla úspěšná, současné připojení nelze znovu použít, protože stále obsahuje staré heslo, které po změně hesla bude neplatné. Pokud přihlášení uspěje, poskytovatel tuto nemovitost vymaže. Následné pokusy o získání starého hesla vracejí VT_EMPTY.

Note

SSPROP_AUTH_OLD_PASSWORD by nikdy neměla být trvalá, protože se používá pouze tehdy, když heslo vyprší.

Všimněte si, že kdykoli je vlastnost "Staré heslo" nastavena, poskytovatel předpokládá, že se pokusí heslo změnit, pokud není také specifikováno Windows Authentication, v takovém případě má vždy přednost.

Pokud je použito Windows autentizace, zadání starého hesla vede buď k DB_E_ERRORSOCCURRED, nebo DB_S_ERRORSOCCURRED v závislosti na tom, zda bylo staré heslo zadáno jako POVINNÉ nebo VOLITELNÉ, a hodnota stavu DBPROPSTATUS_CONFLICTINGBADVALUE se vrací v dwStatus. Toto je detekováno, když je vyvoláno IDBInitialize::Initialize .

Pokud pokus o změnu hesla nečekaně selže, server vrátí chybový kód 18468. Při pokusu o připojení se vrátí standardní chyba OLEDB.

Pro více informací o sadě DBPROPSET_SQLSERVERDBINIT vlastností viz Inicializace a autorizační vlastnosti.

Ovladač ODBC nativního klienta SQL Serveru

Poskytovatel SQL Server Native Client OLE DB podporuje vypršení platnosti hesel prostřednictvím uživatelského rozhraní a programovaně.

Vypršení hesla uživatelského rozhraní ODBC

Nativní ODBC ovladač klienta SQL Server podporuje vypršení hesla prostřednictvím změn v dialogových oknech SQL Server Login.

Pokud je vyvolán SQLDriverConnect a hodnota DriverCompletion je nastavena na SQL_DRIVER_NOPROMPT, počáteční pokus o připojení selže, pokud heslo vypršelo. Hodnota SQLSTATE 28000 a nativní hodnota chybového kódu 18487 jsou vráceny při následných volaních do SQLError nebo SQLGetDiagRec.

Pokud bylo DriverCompletion nastaveno na jinou hodnotu, uživatel vidí dialog SQL Server Login, bez ohledu na to, zda heslo vypršelo nebo ne. Uživatel může kliknout na tlačítko Možnosti a zaškrtnout Změnit heslo pro změnu hesla.

Pokud uživatel klikne na OK a heslo vypršelo, SQL Server vyzve k zadání a potvrzení nového hesla pomocí dialogu Změnit heslo SQL Server.

Chování promptů ODBC a zamčené účty

Pokusy o připojení mohou selhat kvůli zamčení účtu. Pokud k tomu dojde po zobrazení dialogu SQL Server Login, zobrazí se uživateli chybová zpráva serveru a pokus o připojení je přerušen. Může se také objevit po zobrazení dialogu Změnit heslo SQL Server, pokud uživatel zadá špatnou hodnotu pro staré heslo. V tomto případě se zobrazí stejná chybová zpráva a pokus o připojení je přerušen.

Sdílení ODBC připojení, vypršení hesla a zamčené účty

Účet může být zamčen nebo jeho heslo může vypršet, zatímco je spojení stále aktivní v poolu připojení. Server dvakrát kontroluje vypršená hesla a uzamčené účty. První je, když je spojení poprvé vytvořeno. Podruhé je to při resetu připojení, kdy je spojení odebráno z poolu.

Když pokus o reset selže, spojení je z poolu odstraněno a chyba se vrátí.

Expirace programatického hesla ODBC

Ovladač ODBC pro nativního klienta SQL Server podporuje vypršení platnosti hesla přidáním atributu SQL_COPT_SS_OLDPWD, který se nastaví před připojením k serveru pomocí funkce SQLSetConnectAttr.

Atribut SQL_COPT_SS_OLDPWD v handle připojení odkazuje na vypršené heslo. Pro tento atribut neexistuje atribut připojovací řetězec, protože by to narušovalo connection pooling. Pokud přihlášení uspěje, řidič tuto atribut vymaže.

Ovladač ODBC SQL Server Native Client SQL_ERROR vrací ve čtyřech případech pro tuto funkci: vypršení hesla, konflikt politiky hesel, zablokování účtu a při nastavení starého hesla při použití Windows autentizace. Ovladač vrátí uživateli příslušné chybové zprávy při vyvolání SQLGetDiagField .