Cambiar las contraseñas mediante programación
En versiones anteriores de SQL Server 2005, cuando expiraba una contraseña de usuario, solo el administrador podía restablecerla. A partir de SQL Server 2005, SQL Server Native Client permite administrar la expiración de contraseñas mediante programación a través del proveedor OLE DB de SQL Server Native Client y el controlador ODBC de SQL Server Native Client y a través de los 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 debe conservar las credenciales, debe cifrarlas utilizando la API de cifrado de Win32. Para obtener más información sobre el uso de contraseñas, 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 de Windows porque es demasiado corta. |
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 de 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 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 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 solicitará 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 a continuación 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, se quita la conexión 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ña mediante la agregación de la propiedad SSPROP_AUTH_OLD_PASSWORD (tipo VT_BSTR) agregada a la propiedad DBPROPSET_SQLSERVERDBINIT establecida.
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 utiliza 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 obtener más información sobre el conjunto de propiedades DBPROPSET_SQLSERVERDBINIT, vea Propiedades de inicialización y autorización
Controlador ODBC de SQL Server Native Client
El proveedor OLE DB de 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 proveedor OLE DB 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 está establecido en SQL_DRIVER_NOPROMPT, se produce un error en el intento de conexión inicial si la contraseña ha expirado. Las llamadas subsiguientes a SQLError o SQLGetDiagRec devuelven el valor 28000 de SQLSTATE y el valor de código de error nativo 18487.
Si DriverCompletion se ha establecido en cualquier otro valor, el usuario verá 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 solicitará que se escriba y se confirme una nueva contraseña mediante el cuadro de diálogo Cambiar contraseña de SQL Server.
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 a continuación 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 la contraseña a través de la agregación del atributo SQL_COPT_SS_OLDPWD que se establece antes de conectarse al servidor utilizando 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 de SQL Server Native Client devuelve SQL_ERROR en cuatro casos para esta característica: la expiración de la contraseña, un conflicto de directiva de contraseñas, el bloqueo de la cuenta y cuando se establece la propiedad de la contraseña anterior y se está utilizando la Autenticación de Windows. El controlador devuelve los mensajes de error adecuados al usuario cuando se invoca SQLGetDiagField.