[C#] File.Move z innymi uprawnieniami


(Marcin Obala) #1

Cześć

 

Chciałbym zrobić takie coś. Odpalam program, program odpala się z uprawnieniami użytkownika abc. Użytkownik ABC ma uprawnienia żeby przenieść jakiś plik z folderu do folderu. Natomiast na komputer zalogowany będzie użytkownik XYZ, który nie ma do tego uprawnień. Czy da się to zrobić jakoś żeby to było przezroczyste dla użytkownika ? Żeby użytkownik XYZ odpalając program nie musiał wybierać uruchom jako bo przecież nie ma haseł do użytkownika ABC. Czy da się zrobić tak w windowsie żeby jedna aplikacja odpalała się z innego użytkownika? Albo żeby w kodzie było jakieś przelogowanie? Wiem że to mało bezpieczne z jednej  strony ale aplikacja jest na taki użytek że nie muszę się obawiać że ktoś będzie próbował za pomocą tej aplikacji wstrzyknąć jakiś kod który się wykona z wyższymi uprawnieniami. 


(kostek135) #2

Jak na moje to się nie da, tego robić tak jak proponujesz. Głównie dlatego jak zaimplementowane są procesy. Jeśli proces został już utworzony z uprawnieniami X, to będzie je miał. Musiałbyś rozpocząć nowy proces z wyższymi/innymi uprawnieniami. Nie wiem jak to zrobić ani na Windowsie, ani z użyciem C#. W Javie na Linuksie wystarczyłoby użyć klasy ProcessBuilder i su/sudo. Może i to MS zerżnął z Javy, i będzie dość podobnie.


(Marcin Obala) #3

Albo może inaczej, jaki będzie najlepszy sposób na przetworzenie dużej ilości plików w folderze w którym ciągle się pojawiają nowe?

 

Mam ja sobie folder z 200 000 plików xml. W kazdym pliku jest zapisany jeden test urządzenia. Teraz aplikacja służy do tego że operator skanuje kod kreskowy z urządzenia a program mu wyświetla zielony, czerwony, czy było passed czy failed. I tyle. Więc zrobiłem taką jakby farmę danych, gdzie mielę te pliki przenosząc je do innego folderu, jak się pojawią w folderze nowe to znowu je miele i przenoszę i tak w kółko. Może ktoś ma pomysł jak to zrobić bez przenoszenia plików i bez ciągłego iterowania po 200 000 plików? Jeśli ktoś ma pomysł nie będą potrzebne uprawnienia.


(somekind) #4

Możesz monitorować pojawianie się nowych plików w katalogu za pomocą klasy FileSystemWatcher. Podepnij się pod zdarzenie Created, i w nim przetwarzaj pliki.


(Marcin Obala) #5

Wszystko fajnie ale zauwaz co sie dzieje po restarcie programu? Nie wiem który plik juz zostal przetworzony a który nie. Niby mam plik z podsumowaniem ale nie da sie dopasować która linijka do którego pliku. Tak wiec albo iteruje pliki od nowa albo do pliku wynikowego wrzucam tez nazwę pliku, nastepnie robie raport roznicowy z kolumny nazwapliku oraz z pobranej zawartości folderu, jak mam roznice to wiem ze tych plików nie przetworzylem i je miele, w miedzy czasie juz filewatcher monitoruje czy nie pojawiają sie nowe pliki. Do zrobienia ale wiekszym nakładem.


(kostek135) #6

Nadal pozostaje pytanie, czemu musisz przenosić je do katalogu, do którego dostęp ma tylko X, a nie wszyscy albo grupa do której te osoby należą?


(Mirek Sztramski) #7

@Marcin511

Spróbuj opisać problem jeszcze raz. Od początku do końca.

 

  1. Dlaczego w ogóle pojawiają się pliki w jakimś katalogu?

  2. Jak się nazywają te pliki? Czy istnieje część wspólna w nazwach tych plików czy też są unikalne?

  3. Dlaczego je kopiujesz, czy później (po przeniesieniu) jeszcze coś z nimi robisz?

  4. Ile plików spodziewasz się przetwarzać (tylko te 200k?) oraz w jakim czasie? 200k to nie jest dużo dla odpowiednio dobranej kolekcji.

  5. Czy te pliki pojawią się także bez twojego programu uruchomionego w tle (jako np. usługi)?

  6. Z czego wynika brak uprawnień podczas przenoszenia? Z winy UAC czy z praw własności do katalogu?

 

itp. itd.

 

PS Tak jak napisał kostek135, być może źle podszedłeś do problemu. Po co tworzyć 200k plików na dysku??


(Marcin Obala) #8
  1. Wyrzuca je tester, jeden plik, jeden test urządzenia.

  2. W sumie nie pomyślałem o tym, plik jest zwyczajnie wygenerowaną datą. Mógłbym po prostu zapisywać do jakiej daty przetworzyłem pliki.

  3. To była pierwsza myśl. Przetworzyć i przenieść bo pliki leżą na serwerze i nie mam prawa ich usunąć. Serwer jest udostępniony tylko dla pewnego grona zainteresowanych i w większości mają oni tylko odczyt.

  4. Nie tylko te 200 k. Na serwerze leżą logi z testów kilkudziesięciu modeli urządzeń i w każdym folderze może być ich tyle albo i więcej. Dodatkowo na bieżąco idzie produkcja i dziennie może się tam pojawiać kilkadziesiąt/kilkaset nowych plików.

  5. Tak, pliki pojawiają się bez mojego programu bo są generowane przez software testów.

  6. Brak uprawnień wynika z tego że folder jest udostępniony z prawami readonly.

 

Aplikacja ma robić coś takiego: Operator bierze skaner kodów kreskowych/2d do reki, skanuje kod i dostaje albo zielony ekran albo czerwony. Jak zielony to znaczy że urządzenie przeszło testy i można spakować do pudełka, czerwony że nie można spakować i odkłada. Więc zrobiłem program który zagląda do każdego xmla i wyciąga tylko to info które mnie interesuje. /Test/@Result, /Test/@SerialNumber i zapisuje do pliku obok a plik źródłowy nie tknięty trafia do folderu obok.

 

Ogólnie jutro mam zamiar już przerobić program żeby wczytywać datę i godzinę z nazwy pliku i zapisywać na jakiej dacie skończyłem. Będę musiał też skorzystać z file watchera ponieważ moje aktualne rozwiązanie może nie być efektywne, w pętli nieskończonej co 10 sekund pobieram listę wszystkich plików w folderze z rozszerzeniem xml i je miele. Jak nie ma nic to program znowu czeka 10 sekund. Pobieranie listy 200 k plików a w przyszłości nawet może miliona co dziesięć sekund będzie chwile zajmować.

 

Ogólnie xmle idealnie się nadają na przerzucenie do sql. Dla wszystkich modeli pliki wyglądają tak samo, zmienia się tylko lekko zawartość. W sumie może pomyślę nad parsowaniem tych xmli do jakiejś bazy