WNetGetUser() y nombres de usuario

WNetGetUser() y nombres de usuario

Postby GabrielMartin » Mon Mar 10, 2014 5:06 pm

Muy buenas a todos y gracias por vuestra ayuda.

Mi cuestión se plantea con WNetGetUser(), que como bien sabréis capta el nombre del usuario que, por ejemplo ejecuta una aplicación y proceso, pero que me plantea un pequeño problema. El nombre de usuario que recoge es el que en el momento de la instalación del equipo se denominó, y por mucho que luego cambiemos el nombre de usuario desde panel de control, WNetGetUser() nos seguirá devolviendo el mismo.

Este problema es muy común para aquellas empresas que montan equipos desde una imagen previa: Todos los ordenadores tendrán el mismo nombre. Y también para aquellos que cambian equipos entre diferente personal.

No he probado crear una nueva cuenta de usuario dentro del propio Windows, y se que la manera de resolverlo es trasteando el registro y cambiando los nombres de los directorios donde se guarda la información de cada usuario.

¿Podéis indicarme otra solución más sencilla?

Gracias por vuestra ayuda
GabrielMartin
 
Posts: 4
Joined: Mon Mar 10, 2014 11:34 am

Re: WNetGetUser() y nombres de usuario

Postby Rick Lipkin » Mon Mar 10, 2014 6:55 pm

Gabriel
-- google translate
Very good to all and thanks for your help.

My question arises WNetGetUser (), which as you will know captures the user name, for example and run a process, but I posed a little problem. The username is the collecting was called at the time of installation of the equipment, and then much to change the username from the control panel, WNetGetUser () will return the same to us.

This problem is very common for companies that assemble computers from a previous image: All computers have the same name. And for those that change between different staff teams.

I have not tried creating a new user account within Windows itself, and that the way to solve it is messing the registry and changing the names of the directories where the information is stored for each user.

Can you tell me a simpler solution?

Thanks for your help


Any business that is running a Microsoft AD network automatically generates the new ( client ) user that has just logged in if the account does not exist on the machine.

If the business you describe does not have a Microsoft AD network .. then ( as you mention ) the cloned 'user' will be the same for each machine.

When I use WNetGetUser() .. I bounce the results against a User Table maintained in my application... if that result does not match I throw up a login screen for each user to put in their own userid that I have assigned in the User Table. That way you control the users ( id ) in your table and can then assign roles to those users to manager rights in your application.

Consider ONLY the "logic" in this code ..the data tables are ADO and not DBF ..

Rick Lipkin
Code: Select all  Expand view

// check for valid user and get and set global rights
// login.prg

lOK    := .F.
oDLG   := NIL
cSAY   := " "

xREAD  := " "
xWRITE := " "
xLOGIN := " "
xSUPER := " "
xAdmin := " "

cAUTH  := 'N'
lOK1   := .F.
DEFINE DIALOG oDlg                                            ;
       FROM 5, 8 to 10, 75                                    ;
       TITLE "Logging In ...... Please be patient"            ;
       STYLE nOr( WS_POPUP,WS_CAPTION,WS_THICKFRAME )

       cSAY :=  "Validating User "

       @ 1,13 SAY oSAY VAR cSAY of oDLG //COLOR "N/W"

       oDLG:bStart := { || lOK1 := _Login( cAUTH, oDLG, @oSAY, @cSAY)}

ACTIVATE DIALOG oDLG CENTERED

IF lOK1 = .F.
   RETURN(NIL)
ENDIF

IF xLOGIN = "UNKNOWN"

   SAYING := "The System could not resolve your UserID "+CHR(10)
   SAYING += UPPER( WNetGetuser() )+CHR(10)
   SAYING += "Would you like to Login Manually ?"+CHR(10)

   IF MsgYesNo( SAYING )
      IF _log_in("L")              // log_in.prg
      ELSE
         CLOSE DATABASES
         RETURN(NIL)
      ENDIF
   ELSE
      CLOSE DATABASES
      RETURN(NIL)
   ENDIF

ENDIF

...
...

// end



//---------------------
FUNC _LOGIN( cAUTH, oDLG, oSAY, cSAY )

LOCAL cNAME,SAYING,nPOS,cDEFA,lOK := .F.
LOCAL oRsStaff,cSql,oErr,cFind,lFirst
Local nEid

#INCLUDE "FIVEWIN.CH"

// -- initial setup

cDEFA  := SET(7)
xLOGIN := substr(upper(WNetGetuser()+space(25)),1,25)   // fivewin

cSAY := "Validating User "+xLOGIN
oSAY:ReFresh()
SysReFresh()

lFirst := .f.

oRsStaff := TOleAuto():New( "ADODB.Recordset" )
oRsStaff:CursorType     := 1        // opendkeyset
oRsStaff:CursorLocation := 3        // local cache
oRsStaff:LockType       := 3        // lockoportunistic

// redundant check .. should never happen unless
// all staff users get deleted

cSql := "Select * From [Staff] where [UserId] = '"+alltrim(xLOGIN)+"'"

TRY
   oRsStaff:Open( cSQL, xCONNECT )
CATCH oErr
   MsgInfo( "Error in Opening STAFF table" )
   oDLG:END()
   RETURN(.F.)
END TRY

IF oRsStaff:eof
   xLOGIN := "UNKNOWN"
   xREAD  := 'Y'
   xWRITE := 'N'
   xSUPER := 'N'
ELSE

   xREAD   := if(empty(oRsStaff:Fields("ReadOnly"):Value), "Y",oRsStaff:Fields("ReadOnly"):Value )
   xWRITE  := if(empty(oRsStaff:Fields("WriteOnly"):Value),"N",oRsStaff:Fields("WriteOnly"):Value )
   xSUPER  := if(empty(oRsStaff:Fields("Super"):Value),    "N",oRsStaff:Fields("Super"):Value )
   xLogin  := alltrim(oRsStaff:Fields("UserId"):Value)  // 25

   oRsStaff:Fields("LastLog"):Value := dtoc(date())+" "+time()
   oRsStaff:Update()

ENDIF

oRsStaff:Close()
oRsStaff := nil
oDLG:END()

RETURN(.T.)

//---------------------
FUNC _log_in( cFROM )

Local lOK
Local oBTN1,oBTN2,oUSERID,oPASS,cUSERID,cPASS,SAYING
Local oDLG, oRsUser, oErr, cSQL, oBMP

Local cMODE := "E"
Local cDEFA := SET(7)

// cFROM is where the variable was passed
//  if "M" .. main menu login .. if password is blank  deny login
//  if "L" .. first login screen .. allow

IF EMPTY( cFROM )
   cFROM := "M"
 *   cFROM := "L"
ENDIF

lOK := .F.

oRsUser := TOleAuto():New( "ADODB.Recordset" )
oRsUser:CursorType     := 1        // opendkeyset
oRsUser:CursorLocation := 3        // local cache
oRsUser:LockType       := 3        // lockoportunistic

cSQL := "SELECT * From [Staff] Order by [Lname]"

TRY
  oRsUser:Open(cSQL,xCONNECT )
CATCH oErr
  MsgInfo( "Error in Opening Staff table" )
  RETURN(.F.)
END TRY

cUSERID   := SPACE(25)
cPASS     := SPACE(15)

//------

DEFINE BITMAP oBmp RESOURCE "USERVIEW"
DEFINE DIALOG oDlg RESOURCE "LOGIN"

   REDEFINE GET oUSERID var cUSERID ID 110 of oDLG   UPDATE
   REDEFINE GET oPASS   var cPASS   ID 120 of oDLG   UPDATE

   REDEFINE BTNBMP oBtn1 ID 111 OF oDlg   ;
         RESOURCE "OK", "DOK", "DOK" ;
         PROMPT "  &Ok    " LEFT 2007;
         ACTION ( IF(cMODE = "V",lOK := .T. , lOK := _busrules( oRsUser, cFROM,;
                                                      @cUserid,@cPass,oUserId,oPass,@lOk,oDlg) ), ;
                  IF(cMODE = "V",lOK := .T. , if(lOK = .T., _doit( oRsUser,cUserId,cPass,@lOk,oDlg), )),;
                  IF(lOK = .T., oDLG:END(), ))

   REDEFINE BTNBMP oBtn2 ID 112 OF oDlg   ;
         RESOURCE "CANCEL", "DCANCEL", "DCANCEL" ;
         PROMPT "&Cancel   " LEFT 2007;
         ACTION ( lOK := .F., oDLG:END() )


ACTIVATE DIALOG oDlg CENTERED ;
         ON PAINT (PalBmpDraw( hDC, 0, 0, oBmp:hBitmap ))


oBmp:End()
oRsUser:Close()

RETURN(lOK)

//----------------------------
Static FUNC _Busrules( oRsUser,cFROM,cUserid,cPass,oUserId,oPass,lOk,oDlg )

LOCAL SAYING,xPASS,xUserid

IF EMPTY( cUSERID )  .or. cUSERID = "  "
   SAYING := "SORRY ... USERID can not be left Blank"
   MsgInfo( SAYING )
   oUSERID:SetFocus()
   RETURN(.F.)
ENDIF

IF EMPTY( cPASS ) .or. cPASS = "  "
   SAYING := "SORRY ... PASSWORD can not be left Blank"
   MsgInfo( SAYING )
   oPASS:SetFocus()
   RETURN(.F.)
ENDIF

cUserId := upper(cUSERID)
cPASS   := substr(alltrim( cPASS )+space(15),1,15)

oRsUser:MoveFirst()
oRsUser:Find("[UserId] = '"+cUSERID+"'" )

IF oRsUser:eof
   SAYING := "SORRY ... UserId   "+alltrim(cUSERID)+"   could not be found "+CHR(10)
   SAYING += "Would you like to try again ?"+CHR(10)

   IF MsgYesNo( SAYING )
      cUSERID := SPACE(25)
      oUSERID:ReFresh()
      oUSERID:SetFocus()
      RETURN(.F.)
   ELSE
      lOK := .F.
      RETURN(.F.)
   ENDIF
ENDIF

IF empty(oRsUser:Fields("PASSWORD"):Value) .or.;
   oRsUser:Fields("PASSWORD"):Value = "  "

   IF cFROM = "L"
   ELSE
      SAYING := "SORRY ... there is no Password set for "+cUSERID+CHR(10)
      SAYING += "You can not Login from the Main Menu Login screen"+chr(10)
      SAYING += "without a Password .. Please contact your SYSTEM Admin"+chr(10)
      SAYING += "to have them re-set or create your password"+chr(10)
      MsgInfo( saying )
      cPASS := SPACE(25)
      oPASS:ReFresh()
      oPASS:SetFocus()
      RETURN(.F.)
   ENDIF

   SAYING := "No Password has been set for User  "+cUSERID+CHR(10)
   SAYING += "Would you like '"+cPASS+"' to be your Password ?"+CHR(10)
   IF MsgYesNo( SAYING )
      oRsUser:Fields("PASSWORD"):Value := substr(ENCRYPT( cPASS )+space(15),1,15)
      oRsUser:Update()
   ELSE
      cPASS := SPACE(15)
      oPASS:ReFresh()
      oPASS:SetFocus()
      RETURN(.F.)
   ENDIF

ENDIF

xPASS := ALLTRIM(oRsUser:Fields("PASSWORD"):Value)
xPASS := DENCRYPT( xPASS )
xPASS := substr(alltrim( xPASS )+space(15),1,15)

IF cPASS = xPASS
ELSE
   SAYING := "SORRY ... You have typed in the Wrong Password "+CHR(10)
   SAYING += "Would you like to try again ?"+CHR(10)

   IF MsgYesNo( SAYING )
      cPASS:= SPACE(15)
      oPASS:ReFresh()
      oPASS:SetFocus()
      RETURN(.F.)
   ELSE
      lOK := .F.
      oDLG:END()
      Return(.f.)
   ENDIF
ENDIF

If empty(oRsUser:FIelds("Active"):Value) .or. ;
         oRsUser:Fields("Active"):Value = "N"
   Saying := "Sorry .. "+cUSERID+" has been marked INACTIVE and can not Login"
   MsgInfo( Saying )
   lOK := .F.
   oDLG:END()
   Return(.f.)
Endif

RETURN(.T.)

//----------------------------
Static FUNC _doit( oRsUser,cUserId,cPass,lOk,oDlg )

Local cName

xLOGIN   := alltrim(oRsUser:Fields("UserId"):Value)
xREAD    := oRsUser:Fields("READONLY"):Value
xWRITE   := oRsUser:Fields("WRITEONLY"):Value
xSUPER   := oRsUser:Fields("SUPER"):Value
xAdmin   := " "

oRsUser:Fields("lastlog"):Value := dtoc(DATE())+" "+Time()
oRsUser:Update()


lOK := .T.
oDLG:END()

RETURN(lOK)

 
User avatar
Rick Lipkin
 
Posts: 2633
Joined: Fri Oct 07, 2005 1:50 pm
Location: Columbia, South Carolina USA

Re: WNetGetUser() y nombres de usuario

Postby GabrielMartin » Mon Mar 10, 2014 7:11 pm

Gracias Rick Lipkin por tu pronta respuesta, pero no es exactamente el que busco. Ya cuento con un control interno de usuarios, pero lo que me interesa saber es que ordenador se conecta. Es a efectos de proteccion de datos. La rutina que utilizo y que no acaba de funcionar por el tema que comento es la siguiente:

FUNCTION RegSusuario(cProg)

LOCAL cUsuHD:=WNetGetUser()+" "+cProg+" EL "+DTOC(DATE())+" A LAS "+TIME()+CHR(13)+CHR(10)
LOCAL cRegUsu:=oPhatBasic+"\Registro "+STR(YEAR(DATE()),4)+STR(MONTH(DATE()),2)+".TXT"
LOCAL nFichero

LOCAL cUsuHD2:=cProg+" EL "+DTOC(DATE())+" A LAS "+TIME()
LOCAL cRegUsu2:=oPhatBasic+"\Registro de "+WNetGetUser()+" "+STR(YEAR(DATE()),4)+STR(MONTH(DATE()),2)+".TXT"
LOCAL nFichero2

IF SUBSTR(cProg,1,4)="SALE"
cUsuHD2+=" OK"
ENDIF

cUsuHD2+=CHR(13)+CHR(10)

IF FILE (cRegUsu)
nFichero:=FOpen(cRegUsu,2)
ELSE
nFichero:=FCreate(cRegUsu,0)
ENDIF

FSeek(nFichero,0,2)

FWrite(nFichero,cUsuHD)
FClose(nFichero)

IF FILE (cRegUsu2)
nFichero2:=FOpen(cRegUsu2,2)
ELSE
nFichero2:=FCreate(cRegUsu2,0)
ENDIF

FSeek(nFichero2,0,2)

FWrite(nFichero2,cUsuHD2)
FClose(nFichero2)

RETURN (.T.)

con ella creo un txt en un directorio al que solo tiene acceso el administrador para poder observar los movimientos de los equipos, así como el tiempo y estado de cada uno de ellos.

Mil gracia de nuevo
Un abrazo
GabrielMartin
 
Posts: 4
Joined: Mon Mar 10, 2014 11:34 am

Re: WNetGetUser() y nombres de usuario

Postby Rick Lipkin » Mon Mar 10, 2014 7:21 pm

Gabriel

your computer is connected.


Connected as being able to see a network share ? or connected as already having the application open and logged in ?

Rick Lipkin
User avatar
Rick Lipkin
 
Posts: 2633
Joined: Fri Oct 07, 2005 1:50 pm
Location: Columbia, South Carolina USA

Re: WNetGetUser() y nombres de usuario

Postby GabrielMartin » Mon Mar 10, 2014 7:53 pm

No entiendo muy bien tu pregunta. Necesito saber que ordenador se conecta para detectar posibles intrusos.
GabrielMartin
 
Posts: 4
Joined: Mon Mar 10, 2014 11:34 am

Re: WNetGetUser() y nombres de usuario

Postby RSalazarU » Mon Mar 10, 2014 8:05 pm

Gabriel:

Creo que deberias usar NetName() en vez de WNetGetUser(), esta funcion te da el nombre del equipo donde se esta corriendo la aplicacion.

El nombre del equipo es unico en cada LAN, no puede haber duplicados, si los hay fallaria la conexion. Es un tema de REDES.

Cada equipo en una LAN tiene un nombre unico; y si han sido instalados desde una imagen el administrador se encarga de colocarle/cambiarle a un nombre unico que lo identificara en la LAN.

Atentamente,

Rolando
Cochabamba, Bolivia.
RSalazarU
 
Posts: 211
Joined: Wed Jul 16, 2008 12:59 pm
Location: Cochabamba-Bolivia

Re: WNetGetUser() y nombres de usuario

Postby FranciscoA » Mon Mar 10, 2014 10:37 pm

Mira si puedes sacar algo de este post:
http://forums.fivetechsupport.com/viewt ... 21#p141189
Saludos.
Francisco J. Alegría P.
Chinandega, Nicaragua.

Fwxh-MySql-TMySql
User avatar
FranciscoA
 
Posts: 2112
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

Re: WNetGetUser() y nombres de usuario

Postby GabrielMartin » Tue Mar 11, 2014 8:50 am

Gracias RSalazarU por tu ayuda, realmente con NetName() se consigue el nombre del usuario o lo que para el windows es el USERDOMAIN.
Gracias también a ti Silvio.Falconi por el interesante enlace.

Con todo y con eso, estoy estudiando una solución para poder cambiar el USERNAME de windows. Tan pronto la tenga probada os la detallo.

Gracias a todos por vuestra colaboración

Gabriel Martin
Barcelona, España
GabrielMartin
 
Posts: 4
Joined: Mon Mar 10, 2014 11:34 am


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 30 guests