Cambio de contraseñas de SQL Server Native Client mediante programación

Se aplica a:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)

Importante

SQL Server Native Client (a menudo abreviado SNAC) se ha quitado de SQL Server 2022 (16.x) y SQL Server Management Studio 19 (SSMS). No se recomienda SQL Server Native Client (SQLNCLI o SQLNCLI11) ni el proveedor OLE DB de Microsoft heredado para SQL Server (SQLOLEDB) para el desarrollo de nuevas aplicaciones. Cambie al nuevo controlador OLE DB de Microsoft (MSOLEDBSQL) para SQL Server o al controlador ODBC de Microsoft ODBC Driver for SQL Server más reciente de ahora en adelante. Para SQLNCLI que se incluye como componente de SQL Server motor de base de datos (versiones 2012 a 2019), consulte esta excepción de ciclo de vida de soporte técnico.

En versiones anteriores de SQL Server 2005 (9.x), cuando expiraba una contraseña de usuario, solo el administrador podía restablecerla. A partir de SQL Server 2005 (9.x), SQL Server Native Client admite el control de la expiración de contraseñas mediante programación a través del proveedor OLE DB de SQL Server Native Client y del controlador ODBC de SQL Server Native Client, y a través de cambios en los cuadros de diálogo Inicio de sesión de SQL Server.

Nota

Cuando sea posible, solicite a los usuarios que escriban las credenciales en tiempo de ejecución y eviten almacenarlas en un formato guardado. Si tiene que conservar las credenciales, debe cifrarlas con la API de cifrado de Win32. Para obtener más información sobre el uso de contraseñas seguras, vea Contraseñas seguras.

Códigos de error de inicio de sesión de SQL Server

Cuando no se puede realizar una conexión debido a problemas de autenticación, uno de los códigos de error de SQL Server siguientes estará disponible para la aplicación para ayudar en el diagnóstico y recuperación.

Código de error de SQL Server Mensaje de error
15113 Error de inicio de sesión del usuario '%. * ls'. Motivo: error de validación de contraseña. Se ha bloqueado la cuenta.
18463 Error de inicio de sesión del usuario '%.*ls'. Motivo: error de cambio de contraseña. La contraseña no se puede utilizar en este momento.
18464 Error de inicio de sesión del usuario '%.*ls'. Motivo: error de cambio de contraseña. La contraseña no cumple los requisitos de directiva porque es demasiado larga.
18465 Error de inicio de sesión del usuario '%.*ls'. Motivo: error de cambio de contraseña. La contraseña no cumple los requisitos de directiva porque es demasiado larga.
18466 Error de inicio de sesión del usuario '%.*ls'. Motivo: error de cambio de contraseña. La contraseña no cumple los requisitos de directiva porque no es bastante compleja.
18467 Error de inicio de sesión del usuario '%.*ls'. Motivo: error de cambio de contraseña. La contraseña no cumple los requisitos de la DLL de filtro de contraseña.
18468 Error de inicio de sesión del usuario '%.*ls'. Motivo: error de cambio de contraseña. Error inesperado durante la validación de la contraseña.
18487 Error de inicio de sesión del usuario '%.*ls'. Motivo: la contraseña de la cuenta expiró.
18488 Error de inicio de sesión del usuario '%.*ls'. Motivo: se debe cambiar la contraseña de la cuenta.

Proveedor OLE DB de SQL Server Native Client

El proveedor OLE DB SQL Server Native Client admite la expiración de contraseñas a través de una interfaz de usuario y mediante programación.

Expiración de contraseñas de la interfaz de usuario de OLE DB

El proveedor OLE DB SQL Server Native Client admite la expiración de contraseñas a través de los cambios realizados en los cuadros de diálogo inicio de sesión de SQL Server. Si el valor de DBPROP_INIT_PROMPT está establecido en DBPROMPT_NOPROMPT, se producirá un error en el intento de conexión inicial si la contraseña ha expirado.

Si DBPROP_INIT_PROMPT se ha establecido en cualquier otro valor, el usuario ve el cuadro de diálogo Inicio de sesión de SQL Server, independientemente de que la contraseña haya expirado o no. El usuario puede hacer clic en el botón Opciones y seleccionar Cambiar contraseña para cambiar la contraseña.

Si el usuario hace clic en Aceptar y la contraseña ha expirado, SQL Server pedirá al usuario que escriba y confirme una nueva contraseña mediante el cuadro de diálogo Cambiar contraseña de SQL Server.

Comportamiento de las solicitudes de OLE DB y cuentas bloqueadas

Los intentos de conexión pueden producir un error debido a que la cuenta está bloqueada. Si se produce esto después de la presentación del cuadro de diálogo Inicio de sesión de SQL Server, se muestra un mensaje de error del servidor al usuario y se anula el intento de conexión. Se puede producir también después de la presentación del cuadro de diálogo Cambiar contraseña de SQL Server si el usuario especifica un valor incorrecto de la contraseña anterior. En este caso se muestra el mismo mensaje de error y se anula el intento de conexión.

Agrupación de conexiones de OLE DB, expiración de contraseña y cuentas bloqueadas

Se puede bloquear una cuenta o puede expirar la contraseña cuando la conexión está activa todavía en un grupo de conexiones. El servidor comprueba las contraseñas expiradas y las cuentas bloqueadas en dos ocasiones. La primera vez es cuando se crea una conexión. La segunda ocasión es al restablecer una conexión, cuando se toma la conexión del grupo.

Cuando se produce un error en el intento de reinicio, la conexión se quita del grupo y se devuelve un error.

Expiración de contraseña mediante programación de OLE DB

El proveedor OLE DB de SQL Server Native Client admite la expiración de contraseñas mediante la adición de la propiedad SSPROP_AUTH_OLD_PASSWORD (tipo VT_BSTR) que se ha agregado al conjunto de propiedades DBPROPSET_SQLSERVERDBINIT.

La propiedad "Contraseña" existente hace referencia a DBPROP_AUTH_PASSWORD y se utiliza para almacenar la nueva contraseña.

Nota

En la cadena de conexión, la propiedad "Contraseña anterior" establece SSPROP_AUTH_OLD_PASSWORD, que es la contraseña actual (posiblemente expirada) que no está disponible a través de una propiedad de cadena del proveedor.

El proveedor no conserva el valor de esta propiedad. Cuando se establece esta propiedad, el proveedor no utiliza el grupo de conexiones para la primera conexión porque se producirá una nueva conexión. Si el cambio de contraseña se realiza correctamente, no se puede reutilizar la conexión actual dado que todavía contiene la contraseña anterior, que no será válida después del cambio de contraseña. Además, si el inicio de sesión tiene éxito, el proveedor borra esta propiedad. Los intentos subsiguientes de recuperar la contraseña anterior devuelven VT_EMPTY.

Nota

No se debe conservar SSPROP_AUTH_OLD_PASSWORD nunca porque solo se utiliza cuando una contraseña ha expirado.

Recuerde que siempre que se establece la propiedad "Contraseña anterior", el proveedor asume que intenta cambiar la contraseña, a menos que se especifique también la Autenticación de Windows, en cuyo caso tiene siempre prioridad.

Si se usa la autenticación de Windows, especificar la contraseña anterior da como resultado DB_E_ERRORSOCCURRED o DB_S_ERRORSOCCURRED en función de que la contraseña anterior se haya especificado como REQUIRED u OPTIONAL respectivamente, y se devuelve el valor de estado de DBPROPSTATUS_CONFLICTINGBADVALUE en dwStatus. Esto se detecta cuando se llama a IDBInitialize::Initialize.

Si el intento de cambiar la contraseña produce un error inesperadamente, el servidor devuelve el código de error 18468. Se devuelve un error OLEDB estándar del intento de conexión.

Para más información sobre el conjunto de propiedades DBPROPSET_SQLSERVERDBINIT, consulte Propiedades de inicialización y autorización.

Controlador ODBC de SQL Server Native Client

El proveedor OLE DB SQL Server Native Client admite la expiración de contraseñas a través de una interfaz de usuario y mediante programación.

Expiración de contraseñas de la interfaz de usuario de ODBC

El controlador ODBC de SQL Server Native Client admite la expiración de contraseñas a través de los cambios realizados en los cuadros de diálogo inicio de sesión de SQL Server.

Si se llama a SQLDriverConnect y el valor de DriverCompletion se establece en SQL_DRIVER_NOPROMPT, se produce un error en el intento de conexión inicial si la contraseña ha expirado. El valor SQLSTATE 28000 y el valor de código de error nativo 18487 se devuelven mediante llamadas posteriores a SQLError o SQLGetDiagRec.

Si DriverCompletion se ha establecido en cualquier otro valor, el usuario ve el cuadro de diálogo inicio de sesión de SQL Server, independientemente de si la contraseña ha expirado o no. El usuario puede hacer clic en el botón Opciones y seleccionar Cambiar contraseña para cambiar la contraseña.

Si el usuario hace clic en Aceptar y la contraseña ha expirado, SQL Server pide que escriba y confirme una nueva contraseña mediante el cuadro de diálogo Cambiar SQL Server Contraseña.

Comportamiento de las solicitudes de ODBC y cuentas bloqueadas

Los intentos de conexión pueden producir un error debido a que la cuenta está bloqueada. Si se produce esto después de la presentación del cuadro de diálogo Inicio de sesión de SQL Server, se muestra un mensaje de error del servidor al usuario y se anula el intento de conexión. Se puede producir también después de la presentación del cuadro de diálogo Cambiar contraseña de SQL Server si el usuario especifica un valor incorrecto de la contraseña anterior. En este caso se muestra el mismo mensaje de error y se anula el intento de conexión.

Expiración de la agrupación de conexiones de ODBC y cuentas bloqueadas

Se puede bloquear una cuenta o puede expirar la contraseña cuando la conexión está activa todavía en un grupo de conexiones. El servidor comprueba las contraseñas expiradas y las cuentas bloqueadas en dos ocasiones. La primera vez es cuando se crea una conexión. La segunda ocasión es al restablecer una conexión, cuando se toma la conexión del grupo.

Cuando se produce un error en el intento de reinicio, la conexión se quita del grupo y se devuelve un error.

Expiración de contraseña mediante programación de ODBC

El controlador ODBC de SQL Server Native Client admite la expiración de contraseñas mediante la adición del atributo SQL_COPT_SS_OLDPWD que se establece antes de conectarse al servidor mediante la función SQLSetConnectAttr.

El atributo SQL_COPT_SS_OLDPWD del identificador de conexión hace referencia a la contraseña expirada. No hay ningún atributo de cadena de conexión para este atributo, porque esto interferiría con la agrupación de conexiones. Si el inicio de sesión tiene éxito, el controlador borra este atributo.

El controlador ODBC SQL Server Native Client devuelve SQL_ERROR en cuatro casos para esta característica: expiración de contraseñas, conflicto de directivas de contraseñas, bloqueo de cuenta y cuándo se establece la propiedad de contraseña antigua mientras se usa la autenticación de Windows. El controlador devuelve los mensajes de error adecuados al usuario cuando se invoca SQLGetDiagField .

Consulte también

Características de SQL Server Native Client