Uruchamianie procesu jako użytkownik z poziomu usługi

0

Witam. Chcę z poziomu usługi systemowej uruchomić proces jako zwykły użyszkodnik. Próbuję robić to tak:

Process proces = new Process();
proces.StartInfo.FileName = Application.StartupPath + "\\mojprogram.exe";
proces.StartInfo.UserName = "nazwauzytkownia";
proces.StartInfo.UseShellExecute = false;
proces.Start();

ale niestety wywala wyjątek "odmowa dostępu" :( Wujek google też niezbyt wiele mi powiedział na ten temat. Wie ktoś jak to zrobić inaczej? Z góry dziękuję za pomoc, pozdrawiam.

1

A twoja aplikacja / konto ma uprawnienia do tego? :]

0

Ustawiam hasło dla danego konta

SecureString password = new SecureString();
... // ustawiam haslo
proces.StartInfo.Password = password;

i tak jest lipa :(
O jakie uprawnienia konkretnie Ci chodziło??

1

Możliwe że:

  1. Konto (na komputerze, np. 'użyszkodnik1' czy 'rafał') może mieć zablokowany przez admina dostęp do tego. A przynajmniej wydaje mi się że może bo nigdy nie próbowałem blokować na swojej machinie :]

  2. Projekt -> menu "Project" -> [nazwa projektu] Properties -> Security -> możliwe że masz tam coś odznaczone (wątpie :/).

I jeszcze jedno: Gdzie ci to rzuca? MSDN podaje że ani konstruktor, ani Start() Nie wywalają żadnego wyjątku typu "odmowa dostępu" (bo można by kombinować)...

0

Nie mam pojęcia gdzie tkwi problem, dam sobie z tym spokój. Mam teraz inne pytanie, żeby nie zakładać nowego tematu, spytam tutaj: w jaki sposób usługa systemowa może uzyskać dostęp do pulpitu? (a konkretnie chcę zrobić screenshot)

0

tzn Chcesz symulować wcisniecie klawisza PrintScreen wrzucając to do schowka czy gdzie tam? Czy po prostu zdobyć zrzut ekranu?

Z tym drugim problemu nie powinno być. Korzystasz z klasy Graphics

            pictureBox1.Image = new Bitmap(400,400);
            Graphics graphics_obj = Graphics.FromImage(pictureBox1.Image);
            graphics_obj.CopyFromScreen(0, 0, 0, 0, new Size(300, 300), CopyPixelOperation.SourceCopy);
0
dark_astray napisał(a)

Korzystasz z klasy Graphics

I dostajesz wyjątek "Nieprawidłowe dojście" :P

Z usługą systemową nie jest tak prosto jak w przypadku zwykłego procesu.
Znalazłem w googlach coś takiego jak "Allow service to interact with Desktop" ale to niestety nie działa na Win Vista (na 7 raczej też nie)... Więc szukam innego rozwiązania. Any ideas?? [???]

0

Wybacz, dotarło do mojej głowy tylko "chce zrobić screenshot" :D

1

BitBlt. Ale 1) - to funkcja z GDI, 2) - swojego czasu się namęczyłem z implementacją tego, 3) kopiuje tylko z okna, czyli musisz mieć handle.

Może spróbuj jednak zasymulować naciśnięcie printscreen (winapi)?

EDIT:

Na przyszłość polecam Google. Zajęło mi to jakieś 0.5 minuty licząc z wpisywaniem.
http://www.codeproject.com/KB/graphics/cscapturescreen1.aspx

I nie byłoby prościej gdybyś sam to zrobił...?

0

Nie zrozumieliscie chyba - podaliscie przyklady robienia screena. Ale co po screenie z uslugi, skoro ma wlasny pulpit? Ja jestem ciekaw po co autorowi taka funkcjonalnosc. W 7 interakcja uslugi z pulpitem jest chyba zabroniona (o ile pamietam - nie da sie), a na pewno co najmniej niemile widziana.

Co do glownego pytania: WindowsIdentity.Impersonate() powinno Cie 'przelogowac' na innego uzytkownika.

0

Usługa jest odpięta od pulpitu, przy dobrym wietrze dostanie własny workspace, jak coś spróbuje wyświetlić to się system spyta czy przełączyć. Tyle pamiętam z moich bojów z jedną usługą, odsyłam po konkrety do MSDN-u.

1

Według przykładu program nadaje się do robienia screena pulpitu - ale mogę się mylić bo go nie uruchamiałem (nie jestem zarejestrowany żeby pobrać, a kodu nie ma jak przepisać bo jest we fragmentach)


eidt:
Żeby nie pisać nowego postu:

Myślisz że gdyby znalezienie odpowiedzi na moje pytanie zajęłoby mi 0.5 minuty to zawracałbym tym gitare ludziom na forum??? Akurat link który podałeś nie ma nic wspólnego z robieniem screena przez usługę windows. Na przyszłość polecam naukę czytania ze zrozumieniem zanim zaczniesz udzielać rad jak korzystać z google.

Są tacy którzy nie wejdą na google nawet jeśli zajęłoby im to mniej niż 10 sekund. I sorry za oskarżenia bo byłem wtedy trochę podenerwowany... Tak czy inaczej powodzenia.

0

Bo usluga ma wlasny pulpit, jak kazdy uzytkownik. W XP jak usluga cos wyswietli to nic nie zobaczymy (bo to nie nasz), w 7 i chyba w Viscie troche to ulatwili i jest pytanie czy chcemy zobaczyc co usluga na swoim pulpicie wyswietlila - wtedy przelaczy nas na pulpit uslugi. Co oznacza, ze screen zrobiony z uslugi bedzie screenem pustego pulpitu prawdopodobnie. W 7 zreszta uslugi maja zupelnie wydzielony fragment systemu, komunikowac sie mozna tylko normalnymi sposobami, TCP, pipes, itp. Tak mowia w kazdym razie ;)

0
MSM napisał(a)

Na przyszłość polecam Google. Zajęło mi to jakieś 0.5 minuty licząc z wpisywaniem.
http://www.codeproject.com/KB/graphics/cscapturescreen1.aspx

I nie byłoby prościej gdybyś sam to zrobił...?

Myślisz że gdyby znalezienie odpowiedzi na moje pytanie zajęłoby mi 0.5 minuty to zawracałbym tym gitare ludziom na forum??? Akurat link który podałeś nie ma nic wspólnego z robieniem screena przez usługę windows. Na przyszłość polecam naukę czytania ze zrozumieniem zanim zaczniesz udzielać rad jak korzystać z google.

Wracając do tematu: dzięki johny_bravo, pokombinuje z tą metodą WindowsIdentity.Impersonate() zeby uruchomic osobny proces z uslugi jako user.

0

No niestety dostanie się do innego pulpitu niż nasz "input desktop" jest troszkę bardziej skomplikowane.

http://msdn.microsoft.com/en-us/library/ms681928%28VS.85%29.aspx

Generalnie tutaj masz wszystkie funkcje do tego potrzebne. Pulpit użytkownika znajdzie się pod Winsta0/Default.

Nie testowałem tego, bo za dużo roboty z tym jest. Pamiętaj też, że gdy usługa uruchomiona jest przed logowaniem, pulpit, którego handle chcesz uzyskać, nie istnieje. Nie czekaj też na zalogowanie usera w metodzie inicjalizującej usługę, po pewnym czasie oczekiwania Windows stwierdzi, że uruchomiła się niepoprawnie. Najprostszy będzie jakiś timer, najlepiej byłoby pobierać je z każdym zalogowaniem się użytkownika, no, ale to kolejne funkcje do zabawy z winapi.

W każdym razie, powodzenia.

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