Pegar usuário logado do windows
Vamos nóis denovo....
Preciso pegar o nome do usuário logado no windows, só que a função GETLOGADO que me foi passado só funciona quando eu tenho 1 usuario logado por vez.
No xp e vista tem a opção de troca rapida de usuarios onde eu posso ter mais de um usuário logado.
Ai que está o problema, essa função sempre me retorna o primeiro que logou, mesmo eu tendo dois usuarios logados.
Eu preciso pegar o usuário que estou com a aea de trabalho ativa... é esse nome que eu preciso...
sds
Cia Papel
Curtidas 0
Respostas
Wesley Yamazack
09/12/2008
Luis, estarei verificando o mesmo para você. Assim que tiver um resultado respondo
GOSTEI 0
Cia Papel
09/12/2008
Weslei... descobri o erro.... a fun;áo getlogado que o rodrigo tinha me passado funciona, tambem ja consegui interceptar o momento que ele faz o login, que era minha duvida num topico anterior.
So que tem mais um problema, pra variar.
Eu executo meu programa usando uma função runasuser, que eleva o nivel do usuario para administrador, quando o usuario é limitado.
Por esse motivo a fun;áo getlogado me traz o nome do usuario que eu elevei e nao o que eu estou logado, e preciso fazer isso de dentro do programa, não posso fazer por fora, tipo criar outro programa sem nivel de elevaçao.
Então o que eu gostaria é: pegar o usuario logado de dentro de um programa que foi executado com nivel de elevação de administrador.
Espero que tenha sido claro.
sds
GOSTEI 0
Guinther Pauli
09/12/2008
Olá Luis
Eu tenho uma função que sempre utilizei em meus projetos, experimente para ver se supre a sua necessidade:
{ Declare Windows no uses }
function NomeUsuario: string;
const
Max = 254;
var
Nome: string;
Tam: DWORD;
begin
Tam := Max - 1;
SetLength(Nome,Max);
GetUserName(PChar(Nome),Tam);
SetLength(Nome,Tam);
result := Nome;
end;
Att,
Guinther
Eu tenho uma função que sempre utilizei em meus projetos, experimente para ver se supre a sua necessidade:
{ Declare Windows no uses }
function NomeUsuario: string;
const
Max = 254;
var
Nome: string;
Tam: DWORD;
begin
Tam := Max - 1;
SetLength(Nome,Max);
GetUserName(PChar(Nome),Tam);
SetLength(Nome,Tam);
result := Nome;
end;
Att,
Guinther
GOSTEI 0
Cia Papel
09/12/2008
Ola...
Como te disse, ela funciona perfeitamente, só que tenho uma caracteristica do meu programa, que é executar ele como usuario administrador.
Exemplo pra vc entender.
Crie um programa no delphi utilizando essa function.
Cria um usuario limitado no windows e loga nele.
Localiza o exe gerado no projeto, clica com o botao direito em cima dele, opção executar como, e escolhe o usuario que administrador ou outro qualquer que tenha nivel de administrador.
Você vai ver que ele nao traz o usuario logado e sim o usuario que vc escolheu para executar o sistema.... e eu preciso trazer o usuário logado...
sds
GOSTEI 0
Cia Papel
09/12/2008
Alguma novidade com relação ao tópico?
GOSTEI 0
Rodrigo Mourão
09/12/2008
Olá Alexandre !!!
Ainda não, porém me diz uma coisa: Qual a necessidade de se executar o seu programa como administrator ou como outro usuário que não seja o logado ??
GOSTEI 0
Cia Papel
09/12/2008
O software que temos faz alteraçoes no registro, e muitas empresas tem em suas caracteristicas fazer com que os usuarios sejam "limitados" em suas redes, fazendo com que a ediçao do registro não seja possivel.
Ai a necessidade de fazer com que o software execute como administrador mesmo o usuário sendo limitado.
O problema é que preciso pegar o usuario logado e não o usuario administrador que o sistema elevou.....
GOSTEI 0
Rodrigo Mourão
09/12/2008
Realmente Alexandre a função acima retorna o nome do usuario que há executou. Estarei verificando uma outra forma de retornar o usuário logado !!!
abs !!
GOSTEI 0
Rodrigo Mourão
09/12/2008
Olá Alexandre, como vai ???
Eu tentei todas as possibilidades aqui, inclusive com as funções que você postou no chamado 807 porém sem obter sucesso. Encaminhei seu problema para a administração. Estaremos contactando outros consultores para que possamos tentar resolver seu problema.
Agradeço a compreensão.
Obrigado !!!
GOSTEI 0
Ricardo Boaro
09/12/2008
Olá.
Vamos lá, realmente seu "problema" é complexo, mas estamos aqui para isso mesmo, se fosse barbada vc mesmo resolveria. Entendo que a única forma de revolvermos é coletarmos algumas funções que fazem esse controle de login e testá-las, abaixo estou colocando algumas que conheço.
Function LogUser : String;
{Requer a unit Registry declarada na clausula Uses da Unit}
var
Registro:TRegistry;
begin
Registro := TRegistry.Create;
Registro.RootKey := HKEY_LOCAL_MACHINE;
if Registro.OpenKey(Network\Logon, false) then
begin
result := Registro.ReadString(username);
end;
Registro.Free;
end;
Essa é uma delas, segundo meus testes aqui funciona no Windows XP.
Function usuario: string;
var
buffer: array[0..255] of char;
size: dword;
begin
size := 256;
if GetUserName(buffer, size) then
Result := buffer
else
Result :=
end;
Outra, essa funcionou no Windows Vista, mas temos que testar em sua aplicação tendo modificado o nivel de permissão do usuário.
Function TfrmMensagem.funGetNomeUser: String;
// Adicionar ao User a Classe Registry
var
vobjRegistro : TRegistry;
begin
vobjRegistro := TRegistry.Create;
try
case Win32Platform of
VER_PLATFORM_WIN32_WINDOWS: begin // Windows 9x
vobjRegistro.RootKey := HKEY_LOCAL_MACHINE;
if vobjRegistro.OpenKey(\Network\Logon, True) then
Result := vobjRegistro.ReadString(username);
end;
VER_PLATFORM_WIN32_NT: begin // Windows XP
vobjRegistro.RootKey := HKEY_CURRENT_USER;
if vobjRegistro.OpenKey(\Software\Microsoft\Windows\CurrentVersion\Explorer, True) then
Result := vobjRegistro.ReadString(Logon User Name);
end;
end;
finally
vobjRegistro.Free;
end;
end;
Essa eu testei no XP e retornou certinho, mas vamos ver se funciona para você.
Espero que uma das 3 resolva seu problema, enquanto você testa em sua aplicação eu vou fazer outros testes por aqui.
Abraço e Boas Festas!!
Vamos lá, realmente seu "problema" é complexo, mas estamos aqui para isso mesmo, se fosse barbada vc mesmo resolveria. Entendo que a única forma de revolvermos é coletarmos algumas funções que fazem esse controle de login e testá-las, abaixo estou colocando algumas que conheço.
Function LogUser : String;
{Requer a unit Registry declarada na clausula Uses da Unit}
var
Registro:TRegistry;
begin
Registro := TRegistry.Create;
Registro.RootKey := HKEY_LOCAL_MACHINE;
if Registro.OpenKey(Network\Logon, false) then
begin
result := Registro.ReadString(username);
end;
Registro.Free;
end;
Essa é uma delas, segundo meus testes aqui funciona no Windows XP.
Function usuario: string;
var
buffer: array[0..255] of char;
size: dword;
begin
size := 256;
if GetUserName(buffer, size) then
Result := buffer
else
Result :=
end;
Outra, essa funcionou no Windows Vista, mas temos que testar em sua aplicação tendo modificado o nivel de permissão do usuário.
Function TfrmMensagem.funGetNomeUser: String;
// Adicionar ao User a Classe Registry
var
vobjRegistro : TRegistry;
begin
vobjRegistro := TRegistry.Create;
try
case Win32Platform of
VER_PLATFORM_WIN32_WINDOWS: begin // Windows 9x
vobjRegistro.RootKey := HKEY_LOCAL_MACHINE;
if vobjRegistro.OpenKey(\Network\Logon, True) then
Result := vobjRegistro.ReadString(username);
end;
VER_PLATFORM_WIN32_NT: begin // Windows XP
vobjRegistro.RootKey := HKEY_CURRENT_USER;
if vobjRegistro.OpenKey(\Software\Microsoft\Windows\CurrentVersion\Explorer, True) then
Result := vobjRegistro.ReadString(Logon User Name);
end;
end;
finally
vobjRegistro.Free;
end;
end;
Essa eu testei no XP e retornou certinho, mas vamos ver se funciona para você.
Espero que uma das 3 resolva seu problema, enquanto você testa em sua aplicação eu vou fazer outros testes por aqui.
Abraço e Boas Festas!!
GOSTEI 0
Ricardo Boaro
09/12/2008
Luis,
Resolvido seu problema ?
Podemos encerrar esse chamado ou precisa de algo mais ?
abs
GOSTEI 0
Cia Papel
09/12/2008
Opa.... rapaz, entrei de ferias da empresa e volto dia 05 pra testar.........
GOSTEI 0
Ricardo Boaro
09/12/2008
Luis,
Resolvido seu problema ? Conseguiu testar?
Podemos encerrar esse chamado ou precisa de algo mais ?
abs
Resolvido seu problema ? Conseguiu testar?
Podemos encerrar esse chamado ou precisa de algo mais ?
abs
GOSTEI 0
Cia Papel
09/12/2008
bom dia... pode finalizar.... funcionou perfeitamente... obrigado
GOSTEI 0