Newsgroup: it.comp.lang.visual-basic
Titolo: Ottenere l'user con cui sta girando un dato programma

Sembra una cosa quasi impossibile...
Vorrei evitare i utilizzare WMI, per ora faccio cosě:
1. Ottengo l'handle del processo con OpenProcess e i parametri
PROCESS_QUERY_INFORMATION Or PROCESS_VM_READ
2. Passo alla OpenProcessToken l'handle cosě ottenuto e con TOKEN_QUERY
ottengo l'handle del Token.
3. GetTokenInformation etc (ma qui funziona tutto).
Il problema č al punto 2, infatti la OpenProcessToken apre solo i Token dei
processi di cui sono io owner o quelli relativi all'utente SYSTEM, per quel
che riguarda i processi il cui owner č un altro utente restituisce errore
nonostante io sia Admin.
Ora, so per certo che, da Admin, la cosa si puň fare, infatti programmi come
"HandleEx" della sysinternals riescono ad ottenere queste informazioni senza
problemi, il problema č: come diavolo fanno? Anche spulciando le API native
grandi idee non me ne sono venute (ottenere la lista degli handle attivi nel
sistema, sceglierne uno che si riferisca al token del processo in questione,
duplicarlo e poi darne in pasto la copia a GetTokenInformation? O qualcosa
del genere?) Ogni idea č piů che gradita :-)

 del genere?) Ogni idea è più che gradita :-)
e poi dicono che linux e` difficile e windows e` facile...
per sapere chi sta usando slrn su questo pc mi basta una riga:
comando:
ps aux | grep slrn | awk '{print $1}'
output:
hal1961
-- 
ciao, hal

 
questo esempio lo hai gia' visto?
http://win32.mvps.org/security/opt_gti.cpp
non e' in vb ma si capisce!
bye
r

>Ottenere l'user con cui sta girando un dato programma
A me ha sempre funzionato questo
Private Declare Function apiGetUserName Lib "advapi32.dll" Alias
"GetUserNameA" (ByVal lpBuffer As String, nSize As Long) As Long
Function LoginUserName() As String
    ' Returns the network login name
    Dim lngLen As Long
    Dim lngX As Long
    Dim strUserName As String
    strUserName = String$(254, 0)
    lngLen = 255
    lngX = apiGetUserName(strUserName, lngLen)
    If lngX <> 0 Then
        LoginUserName = Trim(Left$(strUserName, lngLen - 1))
    Else
        LoginUserName = ""
    End If
End Function
Ciao
-- 
Fabio
http://www.codice.it

> A me ha sempre funzionato questo
Per funzionare funziona, però io intendevo un'altra cosa per la verità, e
cioè come ottenere l'user owner di un altro processo che non sia il mio, una
cosa tipo quello che fa il TaskManager di Xp...

 
http://win32.mvps.org/security/opt_gti.cpp
Purtroppo sì... usa lo stesso sistema che uso io :-(
In più ci aggiunge i privilegi di debug, ma con i processi degli altri
utenti non c'è niente da fare...

 hal1961
Se hai i pstools di sysinternals, immagino che sia circa altrettanto
facile.
Uno dei problemi non è solo Win vs. Linux, ma interfaccia grafica vs.
linea di comando...
Qualche tempo fa trovai un sito dove c'era una serie di raffronti fra
le stesse operazioni effettuate in ambiti diversi.
Un esempio che ricordo era l'operazione di trovare, in una certa cartella,
tutti i file nascosti, con i loro nomi esatti, estensione compresa; questo,
a partire dalla macchina appena installata con le opzioni di default e
appena riavviata.
Naturalmente, per ogni SO, è necessaria una macchina adeguatamente
potente. Vado molto, ma molto a occhio, anche coi tempi:
Da DOS:
CD percorso
dir /a:h
Tempo, dieci secondi.
Da Win 3.X
Lancia Program Manager,
seleziona disco
trova la cartella
ordina per attributi
Tempo venticinque secondi.
Da Win 95
Login
Lancia Explorer,
seleziona disco
trova la cartella
attiva la visualizzazione degli attributi
ordina per attributi
Tempo trenta-trentacinque secondi.
*****************
Da qui in poi, è da notare che nonostante tutto non sei sicuro di
esserci riuscito. Se una cartella è di sistema, si devono togliere
gli attributi di sistema prima di poter togliere gli hidden, e per farlo
devi prima sapere che una determinata cartella esiste e il suo nome
preciso.
E queste cose, AFAIK, *NON si possono fare dall'interfaccia windows*
ma solo da linea di comando.
Esempi passo-passo disponibili su richiesta :-).
Il tutto è valido anche a prescindere da _altri_ problemi tipo la
visualizzazione web (da W95 OSR2 in poi, se non sbaglio).
*****************
Da Win 98
*Come sopra*, in più:
registro di sistema
ricerca le chiavi
NeverShowExt e cancellale tutte una per una.
Lancia Explorer
opzioni
strumenti
disattiva visualizzazione web
applica
visualizza tutte le cartelle come quella corrente
seleziona disco
trova la cartella
attiva la visualizzazione degli attributi
ordina per attributi
seleziona
Tempo tre minuti e mezzo se sei pratico.
[Win NT è un discorso a parte]
Da Win2K-XP
*Tutto come sopra*, in più:
abilitare la visualizzazione file nascosti:
strumenti
opzioni cartella
usa cartelle di windows
tab visualizzazione
visualizza cartelle e file nascosti
togli nascondi i file di sistema
togli nascondi le estensioni per i file conosciuti
selezionare le colonne e attivare la visualizzazione degli attributi
Tempo quattro-cinque minuti almeno.
E' anche da notare che su sistemi di classe NT, ci sono cartelle
e file che *non possono assolutamente* essere visualizzati mentre il
sistema gira, senza utilities aggiuntive (Perflib e simili).
E le named pipes, e i mailslots ?
E ci sarebbe da fare un discorso sugli ADS, Alternate Data Stream:
flussi dati che possono venir letteralmente nascosti all'interno di altri
files, se il filesystem è NTFS, e non essere poi visualizzati, neanche
come allungamento del file: la dimensione rimane apparentemente
uguale.
Questo è vero progresso :-).
Bye, G.


   Scusa, non sono stato molto attento mentre leggevo il tuo post.
Hai perfettamente ragione.
Tempo fa ho usato questo esempio (almeno mi pare fosse questo)
per identificare il SID dell'owner del prog in esecuzione. Vedi se puo'
servirti.
http://tinyurl.com/9xc5s


 servirti.
Tnx, purtroppo anche qui ci si basa sempre sullo stesso principio
(OpenProcess + OpenProcessToken) e con gli altri utenti non funziona :-(
P.S.
L'esempio del link: "How to Determine if the Current Process is Running
Under an Admin Account" si puň anche ridurre cosě :-)
Private Declare Function IsNTAdmin Lib "advpack.dll" (ByVal dwReserved As
Long, ByRef lpdwReserved As Long) As Long
Public Function IsAdmin() As Boolean
    If IsNTAdmin(ByVal 0, ByVal 0) Then IsAdmin = True
End Function

 Questo è vero progresso :-).
clap clap! finalmente un bell'articolo!
-- 
ciao, hal

 Questo è vero progresso :-).
in dos quante dir avevi ?
su questo portatile me ne ha appena contate 8.041, con 190.652 file.
e per molte di queste cartelle, solo a digitare "cd" e il nome ci metti 30"
se sei un bravo dattilografo.
e con la console di win2000 puoi anche scorrere il buffer, non sei
crocifisso al " | more"...
pap, dai, non scherzare :)
ciao, a.

 crocifisso al " | more"...
perche` non usi l'autocompletamento con il tab ;-)
-- 
ciao, hal

 perche` non usi l'autocompletamento con il tab ;-)
stiamo parlando di progresso. nel dos glielo mettevo io doskey :)

 stiamo parlando di progresso. nel dos glielo mettevo io doskey :)
infatti mi aspetto che ce l'abbia gia` di default, senza dovercelo
mettere io. a proposito, ma il doskey non faceva solo l'history?
-- 
ciao, hal

 a proposito, ma il doskey non faceva solo l'history?
si', e con 15 dir bastava :)
e se ricordi, a prop di progresso, edlin era un inqubo almeno quanto v.
edit fu un invenzione dei dos tardi...

 edit fu un invenzione dei dos tardi...
nel senso di duri di comprendonio? ;-)
-- 
ciao, hal, anzi... uh (c)
(c) copyright Bill, e chi se no?

 del pc) l'intero file :-P
e per ricordare i comandi tu cosa facevi, swappavi? :)

 pap, dai, non scherzare :)
:-P
Bye, G.