Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    [Windows - Nessun linguaggio] Impersonare l'account Guest

    Salute a tutti.

    Su Windows, da uno script che ho creato, avrei bisogno di impersonare temporanemanete un utente di sistema per poter effettuare un accesso al filesystem in maniera esclusiva.
    A tale scopo ho utilizzato con successo l'API LogonUser:
    http://msdn2.microsoft.com/en-us/library/aa378184(VS.85).aspx
    ...che non mi ha dato alcun tipo di problema con le utenze "normali" ma che non ne vuole sapere di funzionare con l'utente Guest di cui ho bisogno per poter gestire una problematica un po' particolare che non vado a descrivere.

    Qualcuno ha idea di come Windows gestisca tale tipo di utenza?
    Apparentemente Guest mi pare essere un normale utente come gli altri con la differenza non ha alcuna password setta di default ma evidentemente c'è qualcosa di più.
    Le risorse che ho trovato con google mi sembrano abbastanza scarse.
    Se può essere utile incollo la parte di codice (Python) che ho buttato giu fino ad ora e che - ripeto - funziona per le utenze "normali" ma non per l'utente Guest.

    codice:
    import os
    import win32security, win32net, win32con, win32api, win32profile, pywintypes
    
    class WinNtAuthorizer:
    
        def impersonate_user(self, username, password):
            handler = win32security.LogonUser(username, None, password,
                        win32con.LOGON32_LOGON_INTERACTIVE,
                        win32con.LOGON32_PROVIDER_DEFAULT)
            win32security.ImpersonateLoggedOnUser(handler)
    
        def terminate_impersonation(self):
            win32security.RevertToSelf()
    
    if __name__ == "__main__":
        authorizer = WinNtAuthorizer()
        print win32api.GetUserName()
        authorizer.impersonate_user('user', '12345')
        print win32api.GetUserName()

    Ringraziamenti anticipati.
    Rilasciata Python FTP Server library 0.5.1
    http://code.google.com/p/pyftpdlib/

    We'll be those who'll make the italian folks know how difficult can be defecating in Southern California without having the crap flying all around the house.

  2. #2
    I privilegi necessari per usare la LogonUser variano a seconda della versione di Windows; tu su quale versione stai lavorando? Che utente stai cercando di impersonare? È la LogonUser o la ImpersonateLoggedOnUser a fallire? Cosa restituisce GetLastError dopo la chiamata che fallisce?
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    I privilegi necessari per usare la LogonUser variano a seconda della versione di Windows;
    Ah questo non lo sapevo ma è un altro problema che si aggiunge.
    Attualmente utilizzo Administrator ma il programma potrebbe essere eseguito anche come utente.
    Su quali sistemi questo potrebbe essere un problema?

    tu su quale versione stai lavorando?
    Windows XP prof SP2

    Che utente stai cercando di impersonare?
    Può essere un qualunque utente di sistema, compreso Guest con il quale gestisco gli accessi anonimi di una applicazione server FTP.

    È la LogonUser o la ImpersonateLoggedOnUser a fallire?
    La LogonUser. Mi sono però accorto giusto pochi minuti fa che l'utente Guest era disabilitato. Ora sembra funzionare.
    La cosa strana è che da "Gestione" di risorse del computer Guest appariva abilitato mentre da Pannello di controllo --> Account utente no.
    Una volta abilitato da lì sono riuscito ad usare LogonUser con credenziali "Guest" password "" (vuota).
    Rilasciata Python FTP Server library 0.5.1
    http://code.google.com/p/pyftpdlib/

    We'll be those who'll make the italian folks know how difficult can be defecating in Southern California without having the crap flying all around the house.

  4. #4
    Gia che ci sono ne approfitto per chiedere se potreste dirmi se esiste un'API che dato il nome utente mi restituisce la sua home directory (es. C:\documents and settings\user).
    Ho vagato per MSDN ma pare che tale informazione è reperibile soltanto se PRIMA si è swtichati all'utente in questione e solo in seguito utilizzato l'API specifica, cosa che io dovrei evitare.
    Rilasciata Python FTP Server library 0.5.1
    http://code.google.com/p/pyftpdlib/

    We'll be those who'll make the italian folks know how difficult can be defecating in Southern California without having the crap flying all around the house.

  5. #5
    Originariamente inviato da billiejoex
    Ah questo non lo sapevo ma è un altro problema che si aggiunge.
    Attualmente utilizzo Administrator ma il programma potrebbe essere eseguito anche come utente.
    Su quali sistemi questo potrebbe essere un problema?
    Su Windows 2000, dove per impersonare un utente è necessario il privilegio SE_TBC_NAME ("Act as part of the operating system"), normalmente concesso solamente agli amministratori e ad altri account dotati di grandi privilegi (ad esempio l'account LocalSystem, usato per la maggior parte dei servizi).
    La LogonUser. Mi sono però accorto giusto pochi minuti fa che l'utente Guest era disabilitato. Ora sembra funzionare.
    Be', questo spiega tutto .
    Gia che ci sono ne approfitto per chiedere se potreste dirmi se esiste un'API che dato il nome utente mi restituisce la sua home directory (es. C:\documents and settings\user).
    Ho vagato per MSDN ma pare che tale informazione è reperibile soltanto se PRIMA si è swtichati all'utente in questione e solo in seguito utilizzato l'API specifica, cosa che io dovrei evitare.
    Devi usare la NetUserGetInfo chiedendo una struttura USER_INFO_1 che dovrebbe contenere anche il percorso della home directory.
    Amaro C++, il gusto pieno dell'undefined behavior.

  6. #6
    Esempio in C++:
    codice:
    #define _UNICODE
    #pragma comment(lib, "Netapi32.lib")
    #include <iostream>
    #include <string>
    #include <windows.h> 
    #include <lm.h>
    using namespace std;
    wchar_t * GetNetUserPrivilegeName(DWORD usrPriv);
    int wmain(int argc, wchar_t *argv[])
    {
        wchar_t * userName;
        wchar_t * server;
        LPUSER_INFO_1 ui;
        NET_API_STATUS ret;
        if(argc<1)
        {
            wcerr<<L"Sintassi:"<<endl<<
                L"USERINFO username [\\\\serverName]";
            return 1;    
        }
        userName=argv[1];
        server=(argc==1)?NULL:argv[2];
        switch(ret=NetUserGetInfo(server,userName,1,(LPBYTE *)&ui))
        {
        case NERR_Success:
            {
                wcout<<L"Nome utente: "<<ui->usri1_name<<endl
                    <<L"Ultimo cambiamento password "<<ui->usri1_password_age/86400<<L" giorni fa."<<endl
                    <<L"Privilegi utente (approssimativamente): "<<GetNetUserPrivilegeName(ui->usri1_priv)<<endl
                    <<L"Home directory: "<<ui->usri1_home_dir<<endl
                    <<L"Commento: "<<ui->usri1_comment<<endl
                    <<L"Flags: "<<ui->usri1_flags<<endl //Per il significato dei flag rimando alla MSDN
                    <<L"Logon script: "<<ui->usri1_script_path<<endl;
                NetApiBufferFree(ui); 
            }
            break;
        case NERR_InvalidComputer:
            wcerr<<L"Server non valido.";
            break;
        case NERR_UserNotFound:
            wcerr<<L"Utente non trovato.";
            break;
        case ERROR_ACCESS_DENIED:
            wcerr<<L"Accesso negato.";
            break;
        default:
            wcerr<<L"Errore imprevisto (codice "<<ret<<L").";    
        }
        if(ret!=NERR_Success)
            return ret;
        else
            return 0;
    }
    wchar_t * GetNetUserPrivilegeName(DWORD usrPriv)
    {
        switch(usrPriv)
        {
        case USER_PRIV_ADMIN:
            return L"Administrator";
        case USER_PRIV_USER:
            return L"User";
        case USER_PRIV_GUEST:
            return L"Guest";
        default:
            return L"Unknown";
        }
    }
    .
    Tuttavia dopo aver scritto questo esempio ho notato che ui->usri1_home_dir può essere vuoto (come dice la documentazione) e anzi, quasi sempre lo è.
    Qui comunque trovi una soluzione funzionante in Python.
    Amaro C++, il gusto pieno dell'undefined behavior.

  7. #7
    Originariamente inviato da MItaly
    Su Windows 2000, dove per impersonare un utente è necessario il privilegio SE_TBC_NAME ("Act as part of the operating system"), normalmente concesso solamente agli amministratori e ad altri account dotati di grandi privilegi (ad esempio l'account LocalSystem, usato per la maggior parte dei servizi).

    Be', questo spiega tutto .
    Sono stato tratto in inganno dall'interfaccia che raggiungi con [click dx Risorse del computer -> Utenti e gruppi locali -> Users] che è quella che uso di solito quando devo operare sulle utenze.
    Da lì l'utente Guest era abilitato ma da [Pannello di controllo -> Account utente] no.
    Una vera porcata....

    Devi usare la NetUserGetInfo chiedendo una struttura USER_INFO_1 che dovrebbe contenere anche il percorso della home directory.
    Grazie, domani provo.
    Ora vado a dormire che sono cotto.
    Ti faccio sapere.
    Rilasciata Python FTP Server library 0.5.1
    http://code.google.com/p/pyftpdlib/

    We'll be those who'll make the italian folks know how difficult can be defecating in Southern California without having the crap flying all around the house.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.