Crear Extended procedure

16/01/2004 - 18:33 por Rodolfo Torrado López | Informe spam
Hola a todos.

Tengo una aplicación adquirida la cual corre bajo web y fue desarrollada en
C++. La base de datos es SQL, la cual requiere autenticación de SQL. Para
que cada usuario pueda entrar debe autenticarse contra usuarios del SO.

Ya que necesito auditar algunos cambios hechos en ciertas tablas a través de
la aplicación web, he creado Triggers para este efecto. El problema que
tengo es que, debido al modo de autenticación de SQL, no puedo obtener el
nombre de usuario de sistema operativo que está connectado.

¿Sabe alguien como lograr esto? (por favor, no me suguieran funciones del
sistema user, SYSTEM_USER, user_name(), CURRENT_USER, SESSION_USER ya que
ellas no funcionan para lo que quiero)

He pensado en crear mi propio eXtended Procedure, pero no soy muy bueno
programando bajo C++.

Tengo una función en Visual (Basic) que hace exactamente lo que quiero:

***********
Private Declare Function apiGetUserName Lib "advapi32.dll" Alias _
"GetUserNameA" (ByVal lpBuffer As String, nSize As Long) As Long

Function fOSUserName() As String
' Returns the network login name
Dim lngLen As Long, lngX As Long
Dim strUserName As String
strUserName = String$(254, 0)
lngLen = 255
lngX = apiGetUserName(strUserName, lngLen)
If ( lngX > 0 ) Then
fOSUserName = Left$(strUserName, lngLen - 1)
Else
fOSUserName = vbNullString
End If
End Function
************

El problema es que sólo puedo registrar com xp, dll's hechas en C/C++ (hasta
donde tengo entendido).

Conoce alguien algo parecido en C/C++ o quiza una forma de hacerlo
directamente desde SQL 2000.

Agradezco la colaboración.

Rodolfo Torrado
MCP SQL Server
Barranquilla - Colombia
 

Leer las respuestas

#1 Rodolfo Torrado López
16/01/2004 - 22:02 | Informe spam
Adrian, tienes razón en parte.

Efectivamente el modo de seguridad en el que "debo" correr el servidor de
SQL me restringe, pero he estado investigando y existe una forma de
hacerlo: a través del instanciamiento de objetos OLE, es decir, a pesar de
que no puedo crear un XP con funciones de Visual Basic, si puedo crear un
objeto OLE a partir de un componente (DLL) a través de OLE Automation
Object.

De hecho, los facbricantes del software lo hacen, y en los logs
predeterminados, muestran, entre otras cosas, la IP y el username de OS
(domain\username) desde donde se modifican algunas cosas dentro de la
aplicación.

Los mantendré informados de mis avances al repecto.

Gracias.

Rodolfo Torrado
MCP SQL Server
Enred Comunicaciones S.A.
Barranquilla - Colombia



"Adrian Garcia" escribió en el mensaje
news:
Dado el modo de autenticacion de usuario que esta utilizando la aplicación
cliente no vas a poder tomar el usuario autenticado. La unica forma de hacer
esto es cambiar el modo en que la apliacion se autentica al SQL Server y
alli si tendras forma de obtener el nombre del usuario con las funciones que
provee T-SQL.

Saludos
Adrian D. Garcia
NDSoft

No vas a tener acceso
"Rodolfo Torrado López" wrote in message
news:%
Hola a todos.

Tengo una aplicación adquirida la cual corre bajo web y fue desarrollada


en
C++. La base de datos es SQL, la cual requiere autenticación de SQL. Para
que cada usuario pueda entrar debe autenticarse contra usuarios del SO.

Ya que necesito auditar algunos cambios hechos en ciertas tablas a través


de
la aplicación web, he creado Triggers para este efecto. El problema que
tengo es que, debido al modo de autenticación de SQL, no puedo obtener el
nombre de usuario de sistema operativo que está connectado.

¿Sabe alguien como lograr esto? (por favor, no me suguieran funciones del
sistema user, SYSTEM_USER, user_name(), CURRENT_USER, SESSION_USER ya que
ellas no funcionan para lo que quiero)

He pensado en crear mi propio eXtended Procedure, pero no soy muy bueno
programando bajo C++.

Tengo una función en Visual (Basic) que hace exactamente lo que quiero:

***********
Private Declare Function apiGetUserName Lib "advapi32.dll" Alias _
"GetUserNameA" (ByVal lpBuffer As String, nSize As Long) As Long

Function fOSUserName() As String
' Returns the network login name
Dim lngLen As Long, lngX As Long
Dim strUserName As String
strUserName = String$(254, 0)
lngLen = 255
lngX = apiGetUserName(strUserName, lngLen)
If ( lngX > 0 ) Then
fOSUserName = Left$(strUserName, lngLen - 1)
Else
fOSUserName = vbNullString
End If
End Function
************

El problema es que sólo puedo registrar com xp, dll's hechas en C/C++


(hasta
donde tengo entendido).

Conoce alguien algo parecido en C/C++ o quiza una forma de hacerlo
directamente desde SQL 2000.

Agradezco la colaboración.

Rodolfo Torrado
MCP SQL Server
Barranquilla - Colombia


Preguntas similares