[C#] logowanie do zasobów sieciowych

0

Mam udostępnione w sieci zasoby np: \serwer1\katalog1 dla user1 passwd1.
Potrzebuje z poziomu aplikacji dostać się do tych zasobów.
Jak to zrobić z poziomu c#?

0

Witam

Najprościej to chyba:

string path = @"\\server\folder";
string[] files = Directory.GetFiles(path);

To zwróci Ci ścieżki do plików w danym folderze. Ponadto klasy w przestrzeni System.IO mają ogromne możliwości w tej dziedzinie. Szczególnie Directory, File, DirectoryInfo, FileInfo.

Oczywiście program należy uruchomić za pomocą opcji RunAs. Czy o to chodzi?

Jeżeli nie chcesz uruchamiać aplikacji poprzez "RunAs", oto mały przykład "impersonalizacji". Zwróć uwagę na konieczność przesłania hasła jako zwykłego tekstu.

        private const int LOGON_TYPE_INTERACTIVE = 2;
        private const int LOGON_TYPE_PROVIDER_DEFAULT = 0;

        // Using this api to get an accessToken of specific Windows User by its user name and password
        [DllImport("advapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
        static public extern bool LogonUser(string userName, string domain, string passWord, 
              int logonType, int logonProvider, ref IntPtr accessToken);

static void Main(string[] args)
        {
                 string[] files;

                 IntPtr accessToken = IntPtr.Zero;
                 if (LogonUser("testKonto", "mojaDomena", "AAAaaa1234",
                             LOGON_TYPE_INTERACTIVE,  LOGON_TYPE_PROVIDER_DEFAULT, ref accessToken))
                 {
                     WindowsIdentity identity = new WindowsIdentity(accessToken);   
                     WindowsImpersonationContext context = identity.Impersonate();
                     files = Directory.GetFiles(@"\\zdalnySerwer\folder");
                     context.Undo();
                 }          
            
        }

PS. W jaki sposób włączyć podkreślanie składni c#?

0

Ok. Próbowałem to zastosować dla
komputer: \komp1
login: log1
passwd: pass1
ale mi nie wyszło. Nic mi nie wczytało. Mógł byś mi napisać jak to wczytać np do listbox-a?

private void button1_Click(object sender, EventArgs e)
        {

           string[] files;
           IntPtr accessToken = IntPtr.Zero;
                 if (LogonUser("log1", "komp1", "pass1", LOGON_TYPE_INTERACTIVE,  LOGON_TYPE_PROVIDER_DEFAULT, ref accessToken))
                 {
                     WindowsIdentity identity = new WindowsIdentity(accessToken);
                     WindowsImpersonationContext context = identity.Impersonate();
                     files = Directory.GetFiles(@"\\komp1\test");

                                          
                         listBox1.Items.Add(files[0]);
                        
                                              


                     context.Undo();
                 } 
}
0

Nie mam teraz możliwości sprawdzić tego, ale widzę, że chyba nie do końca podajesz prawidłowe dane.
Na komputerze docelowym powinieneś mieć konto, powiedzmy: log1, ktore ma uprawnienia do odczytywania plików z katalogu test. Na komputerze, na którym odpalasz tę aplikację to konto także powinno być utworzone. Wtedy, dzięki poniższej funkcji przelogowujesz się na konto log1.

static public extern bool LogonUser(string userName, string domain, string passWord, 
              int logonType, int logonProvider, ref IntPtr accessToken);

Powinieneś zatem podawać odpowiednio: log1, nazwa domeny (prawdopodobnie u Ciebie nazwa Twojego komputera), hasło do konta log1.

Swoją drogą zanim zadałeś to pytanie, powinieneś przedebugować aplikację - czy w ogóle program wchodzi Ci do tego ifa?
Prawdopodobnie nie. Jeżeli tak, to znaczy, że podałeś dobre dane, ale coś innego nie działa - być może Twoje konto nie ma uprawnień na komputerze docelowym. Może być dużo przyczyn i moje pisanie tutaj to zgadywanie.</cpp>

0

Faktycznie nie wchodzi do tego ifa :(

Na komputerze, na którym odpalasz tę aplikację to konto także powinno być utworzone.

Mi chodziło właśnie o to, żeby takie konto nie musiało istnieć na komputerze z którego odpalam aplikacje.
Coś jak mapowanie dysku używając innej nazwy użytkownika.

1 użytkowników online, w tym zalogowanych: 0, gości: 1