[ mikelins @ 08.08.2007. 12:53 ] @
Moja c# webaplikacija cita sadrzaj direktorijuma drugog racunara u mrezi. Direktorijum je share-ovan tako da svi user-i mogu da mu pristupe. Ukoliko iz koda pokusam da procitam sadrzaj direktorijuma pukne mi jer trazi username i password. Ako pristupim tom direktorijumu "rucno" preko windows explorer-a ponovo mi zatrazi username i password i ako check-iram remember password moj program ce raditi bez problema jer windows zapamti username i password. Kako da resim ovaj problem iz koda da sa bilo kog racunara sve radi kako treba bez rucnog unosa username-a i password-a?
Hvala
[ Boško @ 08.08.2007. 17:09 ] @
Probaj ovako

Code:


  Private Const NO_ERROR = 0
  Private Const CONNECT_UPDATE_PROFILE = &H1
  ' The following includes all the Private Constants defined for NETRESOURCE,
  ' not just the ones used in this example.
  Private Const RESOURCETYPE_DISK = &H1
  Private Const RESOURCETYPE_PRINT = &H2
  Private Const RESOURCETYPE_ANY = &H0
  Private Const RESOURCE_CONNECTED = &H1
  Private Const RESOURCE_REMEMBERED = &H3
  Private Const RESOURCE_GLOBALNET = &H2
  Private Const RESOURCEDISPLAYTYPE_DOMAIN = &H1
  Private Const RESOURCEDISPLAYTYPE_GENERIC = &H0
  Private Const RESOURCEDISPLAYTYPE_SERVER = &H2
  Private Const RESOURCEDISPLAYTYPE_SHARE = &H3
  Private Const RESOURCEUSAGE_CONNECTABLE = &H1
  Private Const RESOURCEUSAGE_CONTAINER = &H2
  ' Error Private Constants:
  Private Const ERROR_NO_NET_OR_BAD_SERVER As Integer = 53
  Private Const ERROR_BAD_USER_OR_PASSWORD As Integer = 1326
  Private Const ERROR_ACCESS_DENIED As Integer = 5
  Private Const ERROR_ALREADY_ASSIGNED As Integer = 85
  Private Const ERROR_BAD_DEV_TYPE As Integer = 66
  Private Const ERROR_BAD_DEVICE As Integer = 1200
  Private Const ERROR_BAD_NET_NAME As Integer = 67
  Private Const ERROR_BAD_PROFILE As Integer = 1206
  Private Const ERROR_BAD_PROVIDER As Integer = 1204
  Private Const ERROR_BUSY As Integer = 170
  Private Const ERROR_CANCELLED As Integer = 1223
  Private Const ERROR_CANNOT_OPEN_PROFILE As Integer = 1205
  Private Const ERROR_DEVICE_ALREADY_REMEMBERED As Integer = 1202
  Private Const ERROR_EXTENDED_ERROR As Integer = 1208
  Private Const ERROR_INVALID_PASSWORD As Integer = 86
  Private Const ERROR_NO_NET_OR_BAD_PATH As Integer = 1203
  Private Const ERROR_INVALID_ADDRESS As Integer = 487
  Private Const ERROR_NETWORK_BUSY As Integer = 54
  Private Const ERROR_UNEXP_NET_ERR As Integer = 59
  Private Const ERROR_INVALID_PARAMETER As Integer = 87

  <StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Auto)> _
  Public Structure NETRESOURCE
    Public dwScope As Integer
    Public dwType As Integer
    Public dwDisplayType As Integer
    Public dwUsage As Integer
    Public lpLocalName As String
    Public lpRemoteName As String
    Public lpComment As String
    Public lpProvider As String
  End Structure

  Declare Auto Function WNetUseConnection Lib "mpr.dll" _
          (ByVal hwndOwner As Integer, _
           ByRef lpNetResource As NETRESOURCE, _
           ByVal lpPassword As String, _
           ByVal lpUserID As String, _
           ByVal dwFlags As Integer, _
           ByVal lpAccessName As String, _
           ByRef lpBufferSize As Integer, _
           ByRef lpResult As Integer) As Integer
 
 Private Function KonektujSeNaPC(ByVal NazivPC As String, ByVal un As String, ByVal pwd As String) As Boolean
    Dim nRes As NETRESOURCE
    Dim r As Integer
    Dim Result As Integer
    Dim buffer As String
    Dim bufferlen As Integer

    If un = "" Then un = Nothing
    If pwd = "" Then pwd = Nothing

    buffer = Space(64) : bufferlen = Len(buffer)
    With nRes
      .dwType = RESOURCETYPE_DISK
      .lpRemoteName = "\\" & NazivPC
      .lpLocalName = Nothing
      .lpProvider = ""
    End With

    r = WNetUseConnection(0, nRes, pwd, un, 0, buffer, bufferlen, Result)

    Dim ErrTekst As String
    Select Case r
      Case 53, 1203
        ErrTekst = "PC nije uključen ili pogrešan naziv PC-ja!"
      Case 54, 170
        ErrTekst = "Mreža je zauzeta!"
      Case 1326, 86
        ErrTekst = "Pogrešno korisničko ime ili lozinka za pristup PC-ju!"
      Case 5
        ErrTekst = "Pristup PC-ju zabranjen!"
      'Case ...

      Case Else
        ErrTekst = "Nepoznata greška!"
    End Select

    If r <> NO_ERROR Then
      Throw New Exception("GREŠKA " & CStr(r) & "! " & ErrTekst)
      Return False
    End If
    Return True
  End Function



Nadam se da ti neće biti problem prepisati na C#.
[ mikelins @ 09.08.2007. 08:27 ] @
nisam uspeo :(
[ Boško @ 09.08.2007. 14:16 ] @
Objasni malo bliže zašto nisi uspeo. Kako si koristio f-ju, da li f-ja vraća True ili False, možda neku grešku...
[ mikelins @ 09.08.2007. 14:25 ] @
Vraca mi FALSE jer je r = 487

Sta znaci ova linija u VB ?
buffer = Space(64) : bufferlen = Len(buffer)

kako da je napisem u c#?
[ Boško @ 09.08.2007. 15:17 ] @
Greška koju ti vraća je "ERROR_INVALID_ADDRESS".
Verovatno u C#-u moraš da navedeš ".lpRemoteName = "\\\\" & NazivPC" (četiri backslash-a) umesto dva kako se piše u VB-u.

buffer = Space(64) : bufferlen = Len(buffer)

su u stvari dve linije koda:

buffer = Space(64)
bufferlen = Len(buffer)

buffer se puni sa 64 praznih karaktera (Space-ova), da bi u njega primio neke podatke od f-je WNetUseConnection koji u ovom slučaju nisu od značaja. bufferlen je "dužina" buffer-a i mora se predati ovoj f-ji jer ona tako zahteva.

[ mikelins @ 13.08.2007. 11:23 ] @
i dalje imam istu gresku :(
[ Boško @ 13.08.2007. 14:24 ] @
Siguran sam da je u pitanju neka sitnica. Neki previd prilikom prevođenja na C#.
Pogledaj ovaj kod: http://lookfwd.doitforme.gr/bl...ia/PinvokeWindowsNetworking.cs
S obzirom da je u C#, lakše ćeš se snaći.
[ toxi_programer @ 13.08.2007. 21:02 ] @
Ja sad moram da postavim jedan offtopic, glupo mi da otvaram novu temu za tako bzw pitanje.

Potrebno mi je da vidim veličinu nekog objekta. Recimo imam neku svoju klasu i potrebno mi je da vidim koliko ona bajtova zauzima ali ne znam kako... Dakle ono što u C++u radi sizeof.
[ mikelins @ 14.08.2007. 09:06 ] @
Kod radi ali u sledecem redu kada pokusam da uradim sledece

DirectoryInfo di = new DirectoryInfo(putanja);
FileInfo[] rgFiles = di.GetFiles("*.mp3");

ponovo mi trazi ussername i password
[ Boško @ 14.08.2007. 15:13 ] @
Nešto slično sam i ja radio nakon konekcije i to funkcioniše.
E sad šta je u pitanju kod tebe?
Možda način kako su share-ovani diskovi (ili folderi)? U mom slučaju share-ovan je ceo disk, bez ikakvog password-a. Znači UN i PWD su potrebni samo za konekciju na PC.
Kako ti izgleda string "putanja"? Za konekciju bi trebalo da bude npr: "\\PC1", a za pristup folderu "\\PC1\c\Neki_folder".
Da se nisi slučajno diskonektovao odmah nakon konekcije?
Ne pada mi na pamet šta bih još moglo da bude. Kod je OK, ostalo ceš morati da "napipaš".
Inače, ja se konektujem sa WinXP na PC na kome radi Win2000, mada to nema nikakve veze, ali ko bi ga znao.
[ mikelins @ 15.08.2007. 13:51 ] @

Uspe da se konektuje i metod connectToRemote vrati prazan string, kada u sledecem redu pokusam da pristupim dir ne moze da se konektuje i trazi mi username i password. Pokusam da uradim sledece

DirectoryInfo di = new DirectoryInfo(putanja);
FileInfo[] rgFiles = di.GetFiles("*.mp3");

Putanja je dobra i sve ovo lepo radi na mom racunaru, ali kada pokrenem webaplikaciju iz mreze javi se greska sa ussername-om i password-om. Konektujem se sa XP na Win2003 Advanced Server
[ dusty @ 15.08.2007. 15:08 ] @
Kljucna stvar Web aplikacija ! Meni se cini kao double-hop problem, ali prvo nekoliko pitanja:
1. da li koristite u mrezi active directory,
2. pod kojim nalogom se izvrsava aplikacija i koja je autentikacija korisnika (pretpostavljam NTLM),
3. kako je share-ovan taj folder, odnosno ko ima prava pristupa (grupa, korisnik) i zasto tebi trazi username i password ako pokusas pristup preko windows explorera, ako kazes da da svi imaju pravo pristupa.
[ mikelins @ 16.08.2007. 12:51 ] @
1. ne koristi se AD
2. pod administratorskim nalogom, koristi se NTLM
3. serovan je da mogu da mu pristupe svi usseri (everyone) sa full kontrolom. ne znam zasto mi trazi ussername i password
[ mirobor @ 16.08.2007. 22:27 ] @
A jesu li kompjuteri clanovi iste Workgroup-e?
[ dusty @ 17.08.2007. 10:43 ] @
Da, to je security issue NTLM-a koji ne dozvoljava double hop.
Mozes to da resis ne sledeci nacin: na racunaru na kome je IIS da napravis jedan nalog koji ce da sluzi samo za citanje sadrzaja foldera, i takav identican nalog napravi na racunaru sa kojeg hoces da citas sadrzaj serovanog foldera.

Zatim pre izvrsenja metode GetFile promeni security kontekst na gore navedeni nalog preko metode Impersonate.
Code:

        WindowsImpersonationContext wic;

        [DllImport("advapi32.dll")]
        public static extern int LogonUserA(String lpszUsername, String lpszDomain,
            String lpszPassword, int dwLogonType, int dwLogonProvider, ref IntPtr phToken);
        [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        public static extern int DuplicateToken(IntPtr hToken, int impersionationLevel,
            ref IntPtr phNewToken);
        [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
        public static extern bool CloseHandle(IntPtr handle);

        protected void Impersonate(string userName, string domain, string password)
        {
            IntPtr token = IntPtr.Zero, tokenDupl = IntPtr.Zero;
            WindowsIdentity winIdentity;

            if (LogonUserA(userName, domain, password, 2, 0, ref token) != 0 &&
                DuplicateToken(token, 2, ref tokenDupl) != 0)
            {
                winIdentity = new WindowsIdentity(tokenDupl);
                if ((wic = winIdentity.Impersonate()) != null)
                {
                    CloseHandle(tokenDupl);
                    CloseHandle(token);
                }
            }
        }

I na kraju, kada ti treba tvoj kontekst pod kojim si se logovao pozovi wic.Undo(); i to je to
[ mikelins @ 20.08.2007. 08:57 ] @
Kod mi funkcionise kada se logujem na svoj comp, ali nikako ne uspevam da se logujem na drugi comp u mrezi. Postoji user na tom compu pomocu koga pokusavam da se ulogujem. Kada se logujem na svoj koristim
impersonateValidUser("Usser", "ImeMogRacunara", "Password") i sve lepo radi

kada se lugujem na drugi racunar koristim

impersonateValidUser("Usser", "ImeRacunaraUMrezi", "Password") ili
impersonateValidUser("Usser", @"\\ImeRacunaraUMrezi", "Password")

ne funkcionise. Gde je greska ???? :(
[ dusty @ 20.08.2007. 09:52 ] @
Da li taj nalog postoji i na tvom racunaru i na drugom racunaru i da li su im isti username i password ?

BTW posto si rekao da niste u domenu, nema svrhe da drugi parametar domain stavis na bilo sta drugo do '.'.
[ mikelins @ 20.08.2007. 10:09 ] @
Taj nalog postoji samo na drugom racunaru na koji pokusavam da se logujem. Nije isti ussername i password. Kako ce aplikacija znati na koji comp da se loguje?
[ mirobor @ 20.08.2007. 15:20 ] @
Jos jednom pitam jesu li kompjuteri clanovi iste radne grupe, ako nisu i ako nisu na istom domein-u pitace te password do kraja zivota.

//Kako ce aplikacija znati na koji comp da se loguje? //

Aplikacija mozda nezna, ali computer zna da mu neko nepoznat vrslja po disku pa trazi user name i password!
[ mikelins @ 20.08.2007. 15:44 ] @
Jesu clanovi iste Workgroup-e
[ mirobor @ 20.08.2007. 16:24 ] @
Citat:
Taj nalog postoji samo na drugom racunaru na koji pokusavam da se logujem. Nije isti ussername i password.

Isti takav nalog napravi (zamoli da se napravi, ako nemas prava) na prvom kompjuteru, isti user isti password.
Plus moras biti ulogovan pod tim nalogom da bi pristupio folderu na drugom compu.
[ dusty @ 21.08.2007. 08:32 ] @
Onaj snippet koji sam poslao je najjednostavnije resenje da se prevazidje double-hop issue. Sa njime menjas kontekst u kojem se izvrsava tvoj kod tako sto se uradi logon i normalno je da security polise za taj nalog moraju biti dostupne masini - ili u lokalu ili preko AD-a. Posto nemas AD, nalog mora da postoji na masini na kojoj je IIS, i kada tvoj kod pokusa da pristupi drugoj masini za autentikaciju koristice se taj isti nalog. Zato mora da postoji i na remote masini identican nalog.

Citat:
mirobor: Isti takav nalog napravi (zamoli da se napravi, ako nemas prava) na prvom kompjuteru, isti user isti password.
Plus moras biti ulogovan pod tim nalogom da bi pristupio folderu na drugom compu.


Ne, ne moras biti ulogovan pod tim nalogom, upravo je to poenta Svejedno je da li koristi impersionation ili ne, i pod kojim nalogom se izvrsava proces, jer ce kod eksplicitno da ga promeni, a i NTLM ne moze da prosledi token pod kojim si pokrenuo proces drugoj masini.
[ mirobor @ 21.08.2007. 11:44 ] @
Citat:
Ne, ne moras biti ulogovan pod tim nalogom, upravo je to poenta Svejedno je da li koristi impersionation ili ne, i pod kojim nalogom se izvrsava proces, jer ce kod eksplicitno da ga promeni, a i NTLM ne moze da prosledi token pod kojim si pokrenuo proces drugoj masini.

U pravu si, ne mora.