[C++] Kopiëren vanaf een share met credentials lukt niet*

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • lauwsa
  • Registratie: Juli 2010
  • Laatst online: 10-09 20:43
Hallo iedereen,

Ik ben weer een tijdje bezig om wat in C++ te maken, alleen ik heb op het moment een klein probleem. Ik probeer een bestand van locatie A naar locatie B te kopiëren op een Windows 7 pc.

De locatie waar het bestand af moet komen is een netwerk path die beveiligt is met een wachtwoord en gebruikers naam. Ik heb de gegevens hier uiteraard van. De locatie waar het bestand heen moet in de System32 map van Windows.

Als ik het programma als administrator uit voer kan ik aan de System32 map komen, dus dit is geen probleem. Het probleem is dat ik niet met CopyFile van een beveiligde netwerk path kan kopiëren. Ik kan me namelijk nergens "Identificeren".

Ik ben vervolgens door gaan zoeken en ben de functie "LogonUser" tegen gekomen, alleen dit wilt ook niet helpen. Ik krijg nog steeds error 5 "Access is Denied".

Zou iemand me hier mee kunnen helpen of een hint geven wat ik fout doe en is dit wel mogelijk met CopyFile? Alvast bedankt!

Dit is de code die ik tot nu toe heb:

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
        HANDLE handle;

    char * pathsource = "\\\\192.168.1.14\\Data\\oemlogo.bmp";
    char * pathdest = "C:\\Windows\\System32\\oemlogo.bmp";

    LogonUserA("usernaam","192.168.1.14","password",LOGON32_LOGON_NEW_CREDENTIALS,LOGON32_PROVIDER_DEFAULT,&handle);

    if ( ImpersonateLoggedOnUser(handle) ) 
    {
        CopyFileA(pathsource,pathdest,TRUE);
        RevertToSelf();
    }
    
    CloseHandle(handle);

    cout << GetLastError() << endl;

[ Voor 1% gewijzigd door BtM909 op 26-01-2012 09:36 ]


Acties:
  • 0 Henk 'm!

  • BtM909
  • Registratie: Juni 2000
  • Niet online

BtM909

Watch out Guys...

Je weet dat je ook een taal kan toevoegen aan de [code=c++] tag?

Ik verplaats sowieso je topic naar PRG: het gaat in dit geval om een vraag van je code en geen designproblematiek :)

Ace of Base vs Charli XCX - All That She Boom Claps (RMT) | Clean Bandit vs Galantis - I'd Rather Be You (RMT)
You've moved up on my notch-list. You have 1 notch
I have a black belt in Kung Flu.


Acties:
  • 0 Henk 'm!

  • CoolGamer
  • Registratie: Mei 2005
  • Laatst online: 06-09 16:59

CoolGamer

What is it? Dragons?

Ik zou bij elke functie van de Windows API die je aanroept errorhandling plaatsen. Zo weet je waar het mis gaat. Geeft LogonUserA bijv. wel een geldige handle terug?

¸.·´¯`·.¸.·´¯`·.¸><(((º>¸.·´¯`·.¸><(((º>¸.·´¯`·.¸.·´¯`·.¸.·´¯`·.¸<º)))><¸.·´¯`·.¸.·´¯`·.¸.·´¯`·.¸


Acties:
  • 0 Henk 'm!

  • lauwsa
  • Registratie: Juli 2010
  • Laatst online: 10-09 20:43
BtM909 schreef op donderdag 26 januari 2012 @ 09:37:
Je weet dat je ook een taal kan toevoegen aan de [code=c++] tag?

Ik verplaats sowieso je topic naar PRG: het gaat in dit geval om een vraag van je code en geen designproblematiek :)
Bedankt voor de tip en de verplaatsing.
CoolGamer schreef op donderdag 26 januari 2012 @ 09:49:
Ik zou bij elke functie van de Windows API die je aanroept errorhandling plaatsen. Zo weet je waar het mis gaat. Geeft LogonUserA bijv. wel een geldige handle terug?
Ja idd, ik zal het even aanpassen. Ik heb even snel over een "if" van gemaakt:

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    if(LogonUserA("usernaam","192.168.1.14","password",LOGON32_LOGON_NEW_CREDENTIALS,LOGON32_PROVIDER_DEFAULT,&handle) == false)
        cout << "LogonUserA error: " << GetLastError() << "\n";

    if ( ImpersonateLoggedOnUser(handle) ) 
    {
        if(CopyFileA(pathsource,pathdest,true) == false)
            cout << "CopyFileA error: " << GetLastError() << "\n";

        if(RevertToSelf() == false)
            cout << "RevertToSelf error " << GetLastError() << "\n";
    }
    
    if(CloseHandle(handle) == false)
        cout << "CloseHandle error: " << GetLastError() << "\n";

    system("pause");


Alleen copy file returned een error (5).

code:
1
2
3
Bestand word gekopieerd
CopyFileA error: 5
Druk op een toets om door te gaan. . .

[ Voor 5% gewijzigd door lauwsa op 26-01-2012 10:03 ]


Acties:
  • 0 Henk 'm!

  • The End
  • Registratie: Maart 2000
  • Laatst online: 07:49

The End

!Beginning

Je logt in als een andere gebruiker en probeert dan een file te kopieren naar C:\Windows\System32 Dat is een directory waar alleen (elevated*) administrators recht hebben om files naartoe te kopieren.

Mocht de user die je gebruikt wel admin rechten hebben op de 'target' PC, dan moet je nog steeds 'run as administrator'doen om het te laten slagen. Je kan in je manifest file zetten dat je de user account control popup standaard krijgt.

*Vanaf Windows Vista mag zelfs een administrator standaard niet alles meer doen. Als je 'Run as Administrator' doet, dan krijg je elevated permissies.

Acties:
  • 0 Henk 'm!

  • CoolGamer
  • Registratie: Mei 2005
  • Laatst online: 06-09 16:59

CoolGamer

What is it? Dragons?

Er kunnen twee dingen er voor kunnen zorgen dat "Access is Denied" wordt gegeven in dit geval. Ten eerste dat het geen rechten heeft om te lezen, ten tweede dat het geen rechten heeft om te schrijven. Als je geen gebruiker opgeeft met local administratorrechten opgeeft voor LogonUserA, dan geeft CopyFileA een error als je naar de Windows-map schrijft. Dat zou je op kunnen lossen door het eerst te schrijven naar een tijdelijke map, RevertToSelf aan te roepen, waarna het te kopiëren naar de Windows-map.

¸.·´¯`·.¸.·´¯`·.¸><(((º>¸.·´¯`·.¸><(((º>¸.·´¯`·.¸.·´¯`·.¸.·´¯`·.¸<º)))><¸.·´¯`·.¸.·´¯`·.¸.·´¯`·.¸


Acties:
  • 0 Henk 'm!

  • lauwsa
  • Registratie: Juli 2010
  • Laatst online: 10-09 20:43
The End schreef op donderdag 26 januari 2012 @ 10:08:
Je logt in als een andere gebruiker en probeert dan een file te kopieren naar C:\Windows\System32 Dat is een directory waar alleen (elevated*) administrators recht hebben om files naartoe te kopieren.

Mocht de user die je gebruikt wel admin rechten hebben op de 'target' PC, dan moet je nog steeds 'run as administrator'doen om het te laten slagen. Je kan in je manifest file zetten dat je de user account control popup standaard krijgt.

*Vanaf Windows Vista mag zelfs een administrator standaard niet alles meer doen. Als je 'Run as Administrator' doet, dan krijg je elevated permissies.
Dat was inderdaad het probleem, ik heb het als volgt kunnen oplossen:
Afbeeldingslocatie: http://img696.imageshack.us/img696/8990/gelukt.png

Heel erg bedankt iedereen voor jullie hulp.

Edit:

Voor de genen met het zelfde probleem:

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
bool copyfile(char * pathsource, char * pathdest) {
    HANDLE handle;
    if(LogonUserA("user","server","password",LOGON32_LOGON_NEW_CREDENTIALS,LOGON32_PROVIDER_DEFAULT,&handle) == false)
        return false;

    if ( ImpersonateLoggedOnUser(handle) ) 
    {
        if(CopyFileA(pathsource,pathdest,true) == false)
            return false;

        if(RevertToSelf() == false)
            return false;
    } 
    else
    {
        return false;
    }

    if(CloseHandle(handle) == false)
        return false;

    return true;
}


User name en password kan je nog anders doen, maar goed het gaat om het voorbeeld.

[ Voor 26% gewijzigd door lauwsa op 26-01-2012 10:48 ]


Acties:
  • 0 Henk 'm!

  • The End
  • Registratie: Maart 2000
  • Laatst online: 07:49

The End

!Beginning

Mooi dat het werkt. Ik zou nog wel even je code aanpassen. Als CopyFile mislukt, dan roep je geen RevertToSelf aan. De rest van de thread blijf je dan in de contect van de andere user werken. Daarnaast sluit je in dat soort situaties de handle die je terugkrijgt van LogonUser niet.

[ Voor 19% gewijzigd door The End op 27-01-2012 10:37 ]


Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 11-09 12:01
Je checked nu wel return values, maar de waarden waarmee je vergelijkt zijn niet de waarden die in de documentatie vermeld staan.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.

Pagina: 1