Probleme mit Netzlaufwerk



  • Hallo!

    Ich habe die Aufgabe einen Service zu erweitern. Er soll Daten von einem Netzlaufwerk kopieren.
    Der Service läuft als SYSTEM.

    Mein erstes Problem: das mounten.
    Es gibt die möglichkeit über WNetAddConnection2
    code:

    NETRESOURCE nr;
    	ZeroMemory(&nr, sizeof(nr));
    	LPSTR remotePath = (char*)(void*)Marshal::StringToHGlobalAnsi("\\\\server\\share");
    	LPSTR localPath = (char*)(void*)Marshal::StringToHGlobalAnsi("W:");
    	LPSTR pw = (char*)(void*)Marshal::StringToHGlobalAnsi("password");
    	LPSTR user = (char*)(void*)Marshal::StringToHGlobalAnsi("domain\\user");
    
    	nr.dwDisplayType = RESOURCEDISPLAYTYPE_GENERIC;
    	nr.dwScope = RESOURCE_GLOBALNET;
    	nr.dwType = RESOURCETYPE_DISK;
    	nr.dwUsage = RESOURCEUSAGE_CONNECTABLE;
    	nr.lpComment = NULL;
    	nr.lpLocalName = localPath;
    	nr.lpProvider = NULL;
    	nr.lpRemoteName = remotePath;
    	DWORD dResult = WNetAddConnection2(&nr, pw, user, 0);
    

    Ich kann nicht genau sagen warum es nicht funktioniert. Tippe aber mal darauf, dass ich bei der Wertzuweisung etwas falsch mache.

    Eine andere Möglichkeit wäre, einen neuen Prozess zu machen und dann einfach per net befehl.
    Finde ich aber recht unschön.

    Gibt es da noch andere möglichkeiten? bzw. muss ich dazu das laufwerk überhaupt mounten? könnte ja bei Files::Copy einfach den share angeben, aber wohin mit user und password?

    Das zwite Problem: der Kopiervorgang:
    habe also das laufwerk manuell gemounted. in einem testprogramm habe ich auch den kopiervorgang geschrieben und getestet. funktioniert auch ohne probleme:

    try{
    		File::Copy("Q:\\test.exe", "D:\\test.exe");
    	} catch(Exception ^ex){
    		Console::WriteLine(ex->ToString());
    	}
    

    Wenn ich das aber in meinen Service übernheme bekomme ich:

    System.IO.IOException: The specified network password is not correct.

    at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
    at System.IO.File.InternalCopy(String sourceFileName, String destFileName, Boolean overwrite)
    at RapUpdCopy.runFolder() in d:\projects\theservice\updcopy.cpp:line 31

    Line 31 ist der Kopierbefehl
    Gehe mal davon aus, dass es daran liegt, dass der vorgang nichtmehr von meinem Useraccount sondern vom SYSTEM account gestartet wird. Aber was für ein Password wird da angemeckert?
    Was muss ich tun, damit ich die Datei kopieren kann?

    Vielen dank schonmal für jegliche Hilfe. Sind ja einige fragen...

    Grüße Thomas



  • Kann mir denn niemand hekfen?

    Problem hab ich weiterhin...



  • Hy

    An deinem C++-Code kann ich leider nichts falsches feststellen, aber ich habs so gemacht, Probiers mal vllt hilfts ja:

    NETRESOURCE  lpNetResource;
    TCHAR    lpPassword[25];
    TCHAR    lpUserName[25];
    TCHAR    chRemoteRessource[128];
    TCHAR    chLocalRessource[4];
    DWORD    dwState = 0;
    
    ZeroMemory(&lpNetResource, sizeof(lpNetResource));
    _sntprintf_s(chRemoteRessource, _countof(chRemoteRessource), _TRUNCATE, _T("%s\\Pfad"), _T("\\\\rechner"));
    _sntprintf_s(chLocalRessource, _countof(chLocalRessource), _TRUNCATE, _T("G:"));
    
    lpNetResource.dwScope = RESOURCE_GLOBALNET;
    lpNetResource.dwType = RESOURCETYPE_DISK;
    lpNetResource.dwDisplayType = RESOURCEDISPLAYTYPE_GENERIC;
    lpNetResource.dwUsage = RESOURCEUSAGE_CONNECTABLE;
    lpNetResource.lpComment = NULL;
    lpNetResource.lpLocalName = chLocalRessource;
    lpNetResource.lpProvider = NULL;
    lpNetResource.lpRemoteName = chRemoteRessource;
    
    _sntprintf_s(lpUserName, _countof(lpUserName), _TRUNCATE, _T("NetUser"));
    _sntprintf_s(lpPassword, _countof(lpPassword), _TRUNCATE, _T("NetUser"));
    
    dwState = WNetAddConnection2(&lpNetResource, (lpPassword), (lpUserName), 0);
    

    Gibt es da noch andere möglichkeiten? bzw. muss ich dazu das laufwerk überhaupt mounten? könnte ja bei Files::Copy einfach den share angeben, aber wohin mit user und password?

    Mounten naja, es reicht, wenn du einen Verbindung zum "ipc$" des Rechners aufmachst. Dann kannst du beim kopieren die Share direkt aufzumache. Was auch noch geht, den Benutzer mit dem du auf deinen Rechner angemeldet bist, auf dem anderen Rechner mit selben Passwort anlegen, und die Rechte auf der Freigabe geben. Dann geht es auch mit einfacher angabe der Share.

    Line 31 ist der Kopierbefehl
    Gehe mal davon aus, dass es daran liegt, dass der vorgang nichtmehr von meinem Useraccount sondern vom SYSTEM account gestartet wird. Aber was für ein Password wird da angemeckert?
    Was muss ich tun, damit ich die Datei kopieren kann?

    Direkt testen kann es leider nicht, aber ich weiß noch aus einigen alten Erfahrung sowie von Arbeitskollegen, das der SYSTEM-Account keine Netzwerkzugriffe hat. Du musst den Dienst unter einen Account laufen lassen, der für den Netzwerkzugriff die entsprechenden Rechte hat.

    Hoffe ich konnte dir helfe...
    Mfg Marc-O



  • Habe mich nochmal damit beschäftigt.

    Also dein code funktioniert.
    Ich ahtte ihn auch schon laufen, nur habe ich die Logindaten in einem System::String^ und um den umzuwandeln hab ich Marshal benutzt was aber nciht so recht wollte.

    Ich habe jetzt mal rumprobiert und dabei kam raus, dass SYSTEM definitiv kein netzzugriff machen kann.
    Habe dazu ein kleines testprogramm (sowohl mit net.exe als auch mit WnetAddConnection2) und die dann von einem Sheduled task als system ausführen lassen.
    Ging nicht hatte dann ein Nicht verbundenes netzlaufwerk im explorer, das bei aufruf Bad username or password meldete.

    Das Problem ist, dass der Service zwingend als SYSTEM laufen muss...
    Ich habe dann mal versucht mein programm, das die netzlaufwerkverbindung herstellt über ein anderes programm aufzurufen.
    Hier der code:

    String^ pass = "password!";
    	SecureString^ pwd = gcnew SecureString();
    	for(int i=0;i<pass->Length;i++){
    		pwd->AppendChar(pass[i]);
    	}
        Process^ netconnect = gcnew Process();
    	netconnect->StartInfo->FileName= "nettest2.exe";
    	netconnect->StartInfo->WorkingDirectory = "D:\\";
    	netconnect->StartInfo->UserName = "Administrator";
    	netconnect->StartInfo->Password = pwd;
    	netconnect->StartInfo->UseShellExecute=false;	//benötigt, wenn user angegeben
    
    	try{
    		netconnect->Start();
    	}catch(Exception^ ex){
    		Console::Write(ex->ToString());
    	}
    

    Er führt alles ohne fehlermeldung aus. ein cmd öffnet sich.. öffnet dann ein 2. (nettest2.exe) schließt sich alles wieder.
    ABER ich hab kein netzlaufwerk im explorer.

    So eine verflixte scheiße...

    hat vllt noch jemand eine Idee?

    Ist es möglich per SYSTEM eine FTP/SFTP verbuindung zu öffnen?
    keine lsut das jetzt zu versuchen und dann wieder stunden zu verschwenden.



  • Hallo, ich habe das Problem endlich lösen können.
    Also ich habe mich mit meinem Netzwerkadmin zusammengesetzt. der hat mal überprüft, welcher nutzer zugreift.
    Wenn ich mein testprogramm per hand angestartet hab. hat der festgelegte nutzer mit pw zugegriffen.
    Wenn es aber als SYSTEM gestartet wurde, hat er als User den aktuell auf dem Rechner angemeldeten Benutzer genommen. (warum auch immer) der hat natürlich keinen zugriff.
    Desshalb haben wir den Sambamount jetzt so eingestellt, dass er jeden benutzer zum gast account des Mounts umleitet und ihm leserechte gibt (reicht für meine aufgabe)

    Nur mal so fals jemand das problem hat 😉

    Grüße


Anmelden zum Antworten