Mam usługę systemu Windows działającą pod kontem Local System, która tworzy urządzenia DOS przy użyciu funkcji DefineDosDevice. Usługa działa na zdalnym serwerze pulpitu W2K8. Jeśli urządzenia są tworzone przy użyciu poświadczeń usługi, są one tworzone w przestrzeni nazw urządzeń GLOBAL i dlatego są widoczne dla wszystkich użytkowników. Potrzebuję urządzeń widocznych tylko dla konkretnej sesji interakcji.Dlaczego urządzenia DOS zdefiniowane w podosobionej sesji nie są wyświetlane w Eksploratorze
Osiągam to przez podszywanie się pod użytkownika, w którego sesji chcę, aby pojawiły się dyski. Jest to dość proste, pod warunkiem, że identyfikator sesji jest dostępny. Oto prosta aplikacja testu napisałem do zilustrowania problemu:
int _tmain(int argc, _TCHAR* argv[])
{
BOOL result = TRUE;
if(argc > 3 && !wcscmp(argv[2], L"/i"))
{
HANDLE hToken = 0;
DWORD dwSessionId = _wtoi(argv[3]);
result = WTSQueryUserToken(dwSessionId, &hToken);
if(result) result = ImpersonateLoggedOnUser(hToken);
}
if(result)
{
LPTSTR drive = argv[1];
DefineDosDevice(DDD_REMOVE_DEFINITION, drive, NULL);
result = DefineDosDevice(0, drive, L"C:\\test");
}
if(!result)
{
printf("Error: %d\n", GetLastError());
}
return 0;
}
przetestować ten kod, stworzyłem serwis, który uruchamia powłokę poleceń w ramach konta System lokalny:
sc stworzenia test_svc binPath = " cmd/K start”type = type = własna interakcji
usługa ta nie daje się uruchomić, ale zanim to się nie powiedzie, to ikra powłokę poleceń działa w ramach konta System lokalny.
Z cmd.exe lokalny, biegnę:
MySubst.exe x:/i 2
który wywołuje ImpersonateLoggedOnUser(), a następnie zwraca DefineDosDevice()
Od Program cmd.exe działa w sesji użytkownika, uruchamiam:
MySubst.exe y:
Który dzwoni DefineDosDevice bez wywoływanie ImpersonateLoggedOnUser().
To działa. Z cmd.exe mogę uzyskać dostęp do dwóch dysków X: i Y :. Mogę uruchomić notepad.exe z menu Start i zobaczyć napędy X: i Y :. Ponadto jeśli utworzę nową sesję usług terminalowych z innym użytkownikiem, nie zobaczę X: lub Y :.
Jednak Explorer pokazuje tylko napęd Y: pod "wszystkimi komputerami". Y: jest dyskiem, który został utworzony przez uruchomienie mojej aplikacji testowej z programu cmd.exe działającego w sesji docelowej, tj. Personifikacja nie została wykonana. Jeśli ponownie uruchomię program explorer.exe z Menedżera zadań, pojawią się oba dyski X: i Y :.
Użyłem również WinObj.exe z SysInternals do zbadania zdefiniowanych urządzeń Win NT. Co ja widzę to:
- Sessions
- 0
- DosDevices
00000000-000057607
(57607 jest identyfikatorem sesji logowania związane z sesją, że jestem podszywania)
Zawartość „00000000-000057607” są:
Global SymbolicLink \Global??
X: SymbolicLink \\??\C:\test
Y: SymbolicLink \\??\C:\test
Zgodnie z WinObj, oba urządzenia dos są identyczne. Należą do tej samej sesji i sesji logowania. Są to dowiązania symboliczne do tego samego obiektu NT.
Jak to możliwe, że jeden z nich pojawia się w Eksploratorze, a drugi nie.
Jeśli wymusisz zamknięcie i ponowne uruchomienie Eksploratora, czy zobaczy on dyski? –
Może to nie być możliwe po prostu podszywaniu się pod inny numer. Aby dokonać zmiany w Twoim imieniu, może być konieczne uruchomienie rzeczywistego procesu w kontekście docelowym. –
@HarryJohnston Ponowne uruchomienie Explorera powoduje pojawienie się napędów, ale nie jestem pewien, co z tego wyciągnąć. – FishesCycle