Запуск экзешника производится под пользователем SYSTEM.
В других версиях Windows все скрины получатся нормальными, а вот в Server 2012R2 если заблокировать комп (в это время скрины нормальные) и нажать на кнопку "Сменить пользователя" на экране блокировки, все дальшейшие скрины получаются пустыми (полностью белая заливка). Может кто подскажет в какую сторону копать?
Здравствуйте, xteam777, Вы писали:
X>Мне необходимо делать скриншот Winlogon-десктопа.
X>В других версиях Windows все скрины получатся нормальными, а вот в Server 2012R2 если заблокировать комп (в это время скрины нормальные) и нажать на кнопку "Сменить пользователя" на экране блокировки, все дальшейшие скрины получаются пустыми (полностью белая заливка). Может кто подскажет в какую сторону копать?
1. Где проверка ошибок? Например, что GetWindowDC вернула не NULL?
2. А ты уверен, что твой exe запущен в нужной сессии и на нужном десктопе?
Сессии и десктопы ведь могут во время смены пользователя переключаться...
3. На Win8+ и Server2012+ лучше вместо GDI использовать Desktop Duplication API.
И перфоманс получше будет, и поддержка 3D-приложений, и возможность снимать скрины с
winlogon/etc (при наличии прав, разумеется).
X>Запуск экзешника производится под пользователем SYSTEM.
как вы запускаете экзешник под пользователем SYSTEM ??? какая-то служба наверное его запускает...
X>В других версиях Windows все скрины получатся нормальными, а вот в Server 2012R2 если заблокировать комп (в это время скрины нормальные) и нажать на кнопку "Сменить пользователя" на экране блокировки, все дальшейшие скрины получаются пустыми (полностью белая заливка). Может кто подскажет в какую сторону копать?
скорее всего экзешник запускается на другом рабочем столе, не на winlogon
Здравствуйте, alexander_r, Вы писали:
_>Здравствуйте, xteam777, Вы писали:
X>>Запуск экзешника производится под пользователем SYSTEM. _>как вы запускаете экзешник под пользователем SYSTEM ??? какая-то служба наверное его запускает...
X>>В других версиях Windows все скрины получатся нормальными, а вот в Server 2012R2 если заблокировать комп (в это время скрины нормальные) и нажать на кнопку "Сменить пользователя" на экране блокировки, все дальшейшие скрины получаются пустыми (полностью белая заливка). Может кто подскажет в какую сторону копать? _>скорее всего экзешник запускается на другом рабочем столе, не на winlogon
В Win10 удалось победить. Эксешник запускается под пользователем SYSTEM.
Перед каждым снятием скриншота я запускаю такую процедуру(код сырой, но работает, потом причешу):
Но с Server 2012R2 проблема осталась, на остальных терминалах не проверял. Посоветуете куда дальше копать?
function SetWinSta0Desktop: Boolean;
var
bSuccess: Boolean;
hWinSta0: HWINSTA;
hDesktop: HDESK;
err: LongInt;
begin
bSuccess := False;
hWinSta0 := OpenWindowStation('WinSta0', False, GENERIC_ALL);
if hWinSta0 = 0 then
begin
err := GetLastError;
xLog('OpenWindowStation Err code = ' + IntToStr(err) + ' Desc = ' + SysErrorMessage(err));
end;
bSuccess := SetProcessWindowStation(hWinSta0);
if not bSuccess then
begin
err := GetLastError;
xLog('SetProcessWindowStation Err code = ' + IntToStr(err) + ' Desc = ' + SysErrorMessage(err));
end;
//hDesktop := OpenDesktop(szDesktopName, 0, False, GENERIC_ALL);
hDesktop := OpenInputDesktop(DF_ALLOWOTHERACCOUNTHOOK, False, MAXIMUM_ALLOWED);
if hDesktop = 0 then
begin
err := GetLastError;
xLog('OpenInputDesktop Err code = ' + IntToStr(err) + ' Desc = ' + SysErrorMessage(err));
end;
bSuccess := SetThreadDesktop(hDesktop);
if not bSuccess then
begin
err := GetLastError;
xLog('SetThreadDesktop Err code = ' + IntToStr(err) + ' Desc = ' + SysErrorMessage(err));
end;
if hDesktop <> 0 then
CloseDesktop(hDesktop);
if hWinSta0 <> 0 then
CloseWindowStation(hWinSta0);
// if bSuccess then
// ShowLastErrorMessage(0, 'Success')
// else
// ShowLastErrorMessage(0, 'Failed');
Result := bSuccess;
end;
Здравствуйте, xteam777, Вы писали:
X>Здравствуйте, alexander_r, Вы писали:
_>>Здравствуйте, xteam777, Вы писали:
X>>>Запуск экзешника производится под пользователем SYSTEM. _>>как вы запускаете экзешник под пользователем SYSTEM ??? какая-то служба наверное его запускает...
X>>>В других версиях Windows все скрины получатся нормальными, а вот в Server 2012R2 если заблокировать комп (в это время скрины нормальные) и нажать на кнопку "Сменить пользователя" на экране блокировки, все дальшейшие скрины получаются пустыми (полностью белая заливка). Может кто подскажет в какую сторону копать? _>>скорее всего экзешник запускается на другом рабочем столе, не на winlogon
X>В Win10 удалось победить. Эксешник запускается под пользователем SYSTEM.
X>Перед каждым снятием скриншота я запускаю такую процедуру(код сырой, но работает, потом причешу): X>Но с Server 2012R2 проблема осталась, на остальных терминалах не проверял. Посоветуете куда дальше копать? X>
X>function SetWinSta0Desktop: Boolean;
X>var
X> bSuccess: Boolean;
X> hWinSta0: HWINSTA;
X> hDesktop: HDESK;
X> err: LongInt;
X>begin
X> bSuccess := False;
X> hWinSta0 := OpenWindowStation('WinSta0', False, GENERIC_ALL);
X> if hWinSta0 = 0 then
X> begin
X> err := GetLastError;
X> xLog('OpenWindowStation Err code = ' + IntToStr(err) + ' Desc = ' + SysErrorMessage(err));
X> end;
X> bSuccess := SetProcessWindowStation(hWinSta0);
X> if not bSuccess then
X> begin
X> err := GetLastError;
X> xLog('SetProcessWindowStation Err code = ' + IntToStr(err) + ' Desc = ' + SysErrorMessage(err));
X> end;
X> //hDesktop := OpenDesktop(szDesktopName, 0, False, GENERIC_ALL);
X> hDesktop := OpenInputDesktop(DF_ALLOWOTHERACCOUNTHOOK, False, MAXIMUM_ALLOWED);
X> if hDesktop = 0 then
X> begin
X> err := GetLastError;
X> xLog('OpenInputDesktop Err code = ' + IntToStr(err) + ' Desc = ' + SysErrorMessage(err));
X> end;
X> bSuccess := SetThreadDesktop(hDesktop);
X> if not bSuccess then
X> begin
X> err := GetLastError;
X> xLog('SetThreadDesktop Err code = ' + IntToStr(err) + ' Desc = ' + SysErrorMessage(err));
X> end;
X> if hDesktop <> 0 then
X> CloseDesktop(hDesktop);
X> if hWinSta0 <> 0 then
X> CloseWindowStation(hWinSta0);
X>// if bSuccess then
X>// ShowLastErrorMessage(0, 'Success')
X>// else
X>// ShowLastErrorMessage(0, 'Failed');
X> Result := bSuccess;
X>end;
X>
Забыл добавить. Проблема в этой строке:
hWinSta0 := OpenWindowStation('WinSta0', False, GENERIC_ALL);
Err = 5 Access Denied. Что не так не пойму
Здравствуйте, xteam777, Вы писали:
X>Забыл добавить. Проблема в этой строке: X>hWinSta0 := OpenWindowStation('WinSta0', False, GENERIC_ALL); X>Err = 5 Access Denied. Что не так не пойму
А там действительно нужен GENERIC_ALL? А если попробовать запрос на меньшие права.
Btw, такая ошибка "постоянно" возникает, когда пытаются запросить доступ ALL на какой-нибудь объект. Нужно всегда просить/устанавливать только те права, которые действительно нужны.
Здравствуйте, xteam777, Вы писали:
X>Здравствуйте, xteam777, Вы писали:
X>>Здравствуйте, alexander_r, Вы писали:
_>>>Здравствуйте, xteam777, Вы писали:
X>>>>Запуск экзешника производится под пользователем SYSTEM. _>>>как вы запускаете экзешник под пользователем SYSTEM ??? какая-то служба наверное его запускает...
X>>>>В других версиях Windows все скрины получатся нормальными, а вот в Server 2012R2 если заблокировать комп (в это время скрины нормальные) и нажать на кнопку "Сменить пользователя" на экране блокировки, все дальшейшие скрины получаются пустыми (полностью белая заливка). Может кто подскажет в какую сторону копать? _>>>скорее всего экзешник запускается на другом рабочем столе, не на winlogon
X>>В Win10 удалось победить. Эксешник запускается под пользователем SYSTEM.
X>>Перед каждым снятием скриншота я запускаю такую процедуру(код сырой, но работает, потом причешу): X>>Но с Server 2012R2 проблема осталась, на остальных терминалах не проверял. Посоветуете куда дальше копать? X>>
X>>function SetWinSta0Desktop: Boolean;
X>>var
X>> bSuccess: Boolean;
X>> hWinSta0: HWINSTA;
X>> hDesktop: HDESK;
X>> err: LongInt;
X>>begin
X>> bSuccess := False;
X>> hWinSta0 := OpenWindowStation('WinSta0', False, GENERIC_ALL);
X>> if hWinSta0 = 0 then
X>> begin
X>> err := GetLastError;
X>> xLog('OpenWindowStation Err code = ' + IntToStr(err) + ' Desc = ' + SysErrorMessage(err));
X>> end;
X>> bSuccess := SetProcessWindowStation(hWinSta0);
X>> if not bSuccess then
X>> begin
X>> err := GetLastError;
X>> xLog('SetProcessWindowStation Err code = ' + IntToStr(err) + ' Desc = ' + SysErrorMessage(err));
X>> end;
X>> //hDesktop := OpenDesktop(szDesktopName, 0, False, GENERIC_ALL);
X>> hDesktop := OpenInputDesktop(DF_ALLOWOTHERACCOUNTHOOK, False, MAXIMUM_ALLOWED);
X>> if hDesktop = 0 then
X>> begin
X>> err := GetLastError;
X>> xLog('OpenInputDesktop Err code = ' + IntToStr(err) + ' Desc = ' + SysErrorMessage(err));
X>> end;
X>> bSuccess := SetThreadDesktop(hDesktop);
X>> if not bSuccess then
X>> begin
X>> err := GetLastError;
X>> xLog('SetThreadDesktop Err code = ' + IntToStr(err) + ' Desc = ' + SysErrorMessage(err));
X>> end;
X>> if hDesktop <> 0 then
X>> CloseDesktop(hDesktop);
X>> if hWinSta0 <> 0 then
X>> CloseWindowStation(hWinSta0);
X>>// if bSuccess then
X>>// ShowLastErrorMessage(0, 'Success')
X>>// else
X>>// ShowLastErrorMessage(0, 'Failed');
X>> Result := bSuccess;
X>>end;
X>>
X>Забыл добавить. Проблема в этой строке: X>hWinSta0 := OpenWindowStation('WinSta0', False, GENERIC_ALL); X>Err = 5 Access Denied. Что не так не пойму
Добавил перед проблемной строкой строку:
RpcImpersonateClient(nil);
Теперь первый раз OpenWindowStation возвращает 0 (ОК), а второй и последующие Err = 5 Access Denied
2016-11-09 12:58:10.160; OpenInputDesktop HANDLE=368 with error 0 - The operation completed successfully
2016-11-09 12:58:10.160; SetThreadDesktop with error 0 - The operation completed successfully
2016-11-09 12:58:10.161; Current Desktop UOI_NAME = Default Ā ɠ+樀 Err code = 0 Desc = The operation completed successfully
2016-11-09 12:58:10.161; Success with error 0 - The operation completed successfully
2016-11-09 12:58:10.169; Desktop DC = 2231442227
2016-11-09 12:58:12.277; OpenInputDesktop HANDLE=36 with error 0 - The operation completed successfully
2016-11-09 12:58:12.277; SetThreadDesktop with error 0 - The operation completed successfully
2016-11-09 12:58:12.278; Current Desktop UOI_NAME = Default Ā ɠ+樀 Err code = 0 Desc = The operation completed successfully
2016-11-09 12:58:12.278; Success with error 0 - The operation completed successfully
2016-11-09 12:58:12.286; Desktop DC = 2231442227
2016-11-09 12:58:14.403; OpenInputDesktop HANDLE=384 with error 0 - The operation completed successfully
2016-11-09 12:58:14.404; SetThreadDesktop with error 0 - The operation completed successfully
2016-11-09 12:58:14.404; Current Desktop UOI_NAME = Winlogon Ā ɠ+樀+ Err code = 0 Desc = The operation completed successfully
2016-11-09 12:58:14.405; Success with error 0 - The operation completed successfully
2016-11-09 12:58:14.560; Desktop DC = 1090599179
2016-11-09 12:58:16.644; OpenInputDesktop HANDLE=392 with error 0 - The operation completed successfully
2016-11-09 12:58:16.644; SetThreadDesktop with error 0 - The operation completed successfully
2016-11-09 12:58:16.644; Current Desktop UOI_NAME = Winlogon Err code = 0 Desc = The operation completed successfully
2016-11-09 12:58:16.645; Success with error 0 - The operation completed successfully
2016-11-09 12:58:16.652; Desktop DC = 1426140622
2016-11-09 12:58:18.673; OpenInputDesktop HANDLE=40 with error 0 - The operation completed successfully
2016-11-09 12:58:18.673; SetThreadDesktop with error 0 - The operation completed successfully
2016-11-09 12:58:18.674; Current Desktop UOI_NAME = Winlogon Err code = 0 Desc = The operation completed successfully
2016-11-09 12:58:18.674; Success with error 0 - The operation completed successfully
2016-11-09 12:58:18.683; Desktop DC = 2650870083
2016-11-09 12:58:20.704; OpenInputDesktop HANDLE=372 with error 0 - The operation completed successfully
2016-11-09 12:58:20.704; SetThreadDesktop with error 0 - The operation completed successfully
2016-11-09 12:58:20.705; Current Desktop UOI_NAME = Winlogon Err code = 0 Desc = The operation completed successfully
2016-11-09 12:58:20.705; Success with error 0 - The operation completed successfully
2016-11-09 12:58:20.713; Desktop DC = 1392589891
2016-11-09 12:58:22.732; OpenInputDesktop HANDLE=396 with error 0 - The operation completed successfully
2016-11-09 12:58:22.733; SetThreadDesktop with error 0 - The operation completed successfully
2016-11-09 12:58:22.735; Current Desktop UOI_NAME = Winlogon Err code = 0 Desc = The operation completed successfully
2016-11-09 12:58:22.738; Success with error 0 - The operation completed successfully
2016-11-09 12:58:22.751; Desktop DC = 1392589891
2016-11-09 12:58:24.778; OpenInputDesktop HANDLE=404 with error 0 - The operation completed successfully
2016-11-09 12:58:24.779; SetThreadDesktop with error 0 - The operation completed successfully
2016-11-09 12:58:24.780; Current Desktop UOI_NAME = Winlogon Err code = 0 Desc = The operation completed successfully
2016-11-09 12:58:24.780; Success with error 0 - The operation completed successfully
2016-11-09 12:58:24.792; Desktop DC = 2650870083
2016-11-09 12:58:26.815; OpenInputDesktop HANDLE=408 with error 0 - The operation completed successfully
2016-11-09 12:58:26.815; SetThreadDesktop with error 0 - The operation completed successfully
2016-11-09 12:58:26.816; Current Desktop UOI_NAME = Winlogon Err code = 0 Desc = The operation completed successfully
2016-11-09 12:58:26.816; Success with error 0 - The operation completed successfully
2016-11-09 12:58:26.823; Desktop DC = 2650870083
2016-11-09 12:58:28.845; OpenInputDesktop HANDLE=416 with error 0 - The operation completed successfully
2016-11-09 12:58:28.846; SetThreadDesktop with error 0 - The operation completed successfully
2016-11-09 12:58:28.847; Current Desktop UOI_NAME = Default Err code = 0 Desc = The operation completed successfully
2016-11-09 12:58:28.849; Success with error 0 - The operation completed successfully
2016-11-09 12:58:28.859; Desktop DC = 2181107614
Тоесть все переключается, но при этом скрины не скринятся
Здравствуйте, xteam777, Вы писали:
X>Здравствуйте, xteam777, Вы писали:
X>>Здравствуйте, xteam777, Вы писали:
X>>>Здравствуйте, alexander_r, Вы писали:
_>>>>Здравствуйте, xteam777, Вы писали:
X>>>>>Запуск экзешника производится под пользователем SYSTEM. _>>>>как вы запускаете экзешник под пользователем SYSTEM ??? какая-то служба наверное его запускает...
X>>>>>В других версиях Windows все скрины получатся нормальными, а вот в Server 2012R2 если заблокировать комп (в это время скрины нормальные) и нажать на кнопку "Сменить пользователя" на экране блокировки, все дальшейшие скрины получаются пустыми (полностью белая заливка). Может кто подскажет в какую сторону копать? _>>>>скорее всего экзешник запускается на другом рабочем столе, не на winlogon
X>>>В Win10 удалось победить. Эксешник запускается под пользователем SYSTEM.
X>>>Перед каждым снятием скриншота я запускаю такую процедуру(код сырой, но работает, потом причешу): X>>>Но с Server 2012R2 проблема осталась, на остальных терминалах не проверял. Посоветуете куда дальше копать? X>>>
X>>>function SetWinSta0Desktop: Boolean;
X>>>var
X>>> bSuccess: Boolean;
X>>> hWinSta0: HWINSTA;
X>>> hDesktop: HDESK;
X>>> err: LongInt;
X>>>begin
X>>> bSuccess := False;
X>>> hWinSta0 := OpenWindowStation('WinSta0', False, GENERIC_ALL);
X>>> if hWinSta0 = 0 then
X>>> begin
X>>> err := GetLastError;
X>>> xLog('OpenWindowStation Err code = ' + IntToStr(err) + ' Desc = ' + SysErrorMessage(err));
X>>> end;
X>>> bSuccess := SetProcessWindowStation(hWinSta0);
X>>> if not bSuccess then
X>>> begin
X>>> err := GetLastError;
X>>> xLog('SetProcessWindowStation Err code = ' + IntToStr(err) + ' Desc = ' + SysErrorMessage(err));
X>>> end;
X>>> //hDesktop := OpenDesktop(szDesktopName, 0, False, GENERIC_ALL);
X>>> hDesktop := OpenInputDesktop(DF_ALLOWOTHERACCOUNTHOOK, False, MAXIMUM_ALLOWED);
X>>> if hDesktop = 0 then
X>>> begin
X>>> err := GetLastError;
X>>> xLog('OpenInputDesktop Err code = ' + IntToStr(err) + ' Desc = ' + SysErrorMessage(err));
X>>> end;
X>>> bSuccess := SetThreadDesktop(hDesktop);
X>>> if not bSuccess then
X>>> begin
X>>> err := GetLastError;
X>>> xLog('SetThreadDesktop Err code = ' + IntToStr(err) + ' Desc = ' + SysErrorMessage(err));
X>>> end;
X>>> if hDesktop <> 0 then
X>>> CloseDesktop(hDesktop);
X>>> if hWinSta0 <> 0 then
X>>> CloseWindowStation(hWinSta0);
X>>>// if bSuccess then
X>>>// ShowLastErrorMessage(0, 'Success')
X>>>// else
X>>>// ShowLastErrorMessage(0, 'Failed');
X>>> Result := bSuccess;
X>>>end;
X>>>
X>>Забыл добавить. Проблема в этой строке: X>>hWinSta0 := OpenWindowStation('WinSta0', False, GENERIC_ALL); X>>Err = 5 Access Denied. Что не так не пойму
X>Добавил перед проблемной строкой строку: X>
X>RpcImpersonateClient(nil);
X>
X>Теперь первый раз OpenWindowStation возвращает 0 (ОК), а второй и последующие Err = 5 Access Denied
Здравствуйте, xteam777, Вы писали: X>В логах видно следующее: X>
X>2016-11-09 12:58:10.160; OpenInputDesktop HANDLE=368 with error 0 - The operation completed successfully
X>2016-11-09 12:58:10.160; SetThreadDesktop with error 0 - The operation completed successfully
X>2016-11-09 12:58:10.161; Current Desktop UOI_NAME = Default Ā ɠ+樀 Err code = 0 Desc = The operation completed successfully
X>2016-11-09 12:58:10.161; Success with error 0 - The operation completed successfully
X>2016-11-09 12:58:10.169; Desktop DC = 2231442227
X>2016-11-09 12:58:12.277; OpenInputDesktop HANDLE=36 with error 0 - The operation completed successfully
X>2016-11-09 12:58:12.277; SetThreadDesktop with error 0 - The operation completed successfully
X>2016-11-09 12:58:12.278; Current Desktop UOI_NAME = Default Ā ɠ+樀 Err code = 0 Desc = The operation completed successfully
X>2016-11-09 12:58:12.278; Success with error 0 - The operation completed successfully
X>2016-11-09 12:58:12.286; Desktop DC = 2231442227
X>2016-11-09 12:58:14.403; OpenInputDesktop HANDLE=384 with error 0 - The operation completed successfully
X>2016-11-09 12:58:14.404; SetThreadDesktop with error 0 - The operation completed successfully
X>2016-11-09 12:58:14.404; Current Desktop UOI_NAME = Winlogon Ā ɠ+樀+ Err code = 0 Desc = The operation completed successfully
X>2016-11-09 12:58:14.405; Success with error 0 - The operation completed successfully
X>2016-11-09 12:58:14.560; Desktop DC = 1090599179
X>2016-11-09 12:58:16.644; OpenInputDesktop HANDLE=392 with error 0 - The operation completed successfully
X>2016-11-09 12:58:16.644; SetThreadDesktop with error 0 - The operation completed successfully
X>2016-11-09 12:58:16.644; Current Desktop UOI_NAME = Winlogon Err code = 0 Desc = The operation completed successfully
X>2016-11-09 12:58:16.645; Success with error 0 - The operation completed successfully
X>2016-11-09 12:58:16.652; Desktop DC = 1426140622
X>2016-11-09 12:58:18.673; OpenInputDesktop HANDLE=40 with error 0 - The operation completed successfully
X>2016-11-09 12:58:18.673; SetThreadDesktop with error 0 - The operation completed successfully
X>2016-11-09 12:58:18.674; Current Desktop UOI_NAME = Winlogon Err code = 0 Desc = The operation completed successfully
X>2016-11-09 12:58:18.674; Success with error 0 - The operation completed successfully
X>2016-11-09 12:58:18.683; Desktop DC = 2650870083
X>2016-11-09 12:58:20.704; OpenInputDesktop HANDLE=372 with error 0 - The operation completed successfully
X>2016-11-09 12:58:20.704; SetThreadDesktop with error 0 - The operation completed successfully
X>2016-11-09 12:58:20.705; Current Desktop UOI_NAME = Winlogon Err code = 0 Desc = The operation completed successfully
X>2016-11-09 12:58:20.705; Success with error 0 - The operation completed successfully
X>2016-11-09 12:58:20.713; Desktop DC = 1392589891
X>2016-11-09 12:58:22.732; OpenInputDesktop HANDLE=396 with error 0 - The operation completed successfully
X>2016-11-09 12:58:22.733; SetThreadDesktop with error 0 - The operation completed successfully
X>2016-11-09 12:58:22.735; Current Desktop UOI_NAME = Winlogon Err code = 0 Desc = The operation completed successfully
X>2016-11-09 12:58:22.738; Success with error 0 - The operation completed successfully
X>2016-11-09 12:58:22.751; Desktop DC = 1392589891
X>2016-11-09 12:58:24.778; OpenInputDesktop HANDLE=404 with error 0 - The operation completed successfully
X>2016-11-09 12:58:24.779; SetThreadDesktop with error 0 - The operation completed successfully
X>2016-11-09 12:58:24.780; Current Desktop UOI_NAME = Winlogon Err code = 0 Desc = The operation completed successfully
X>2016-11-09 12:58:24.780; Success with error 0 - The operation completed successfully
X>2016-11-09 12:58:24.792; Desktop DC = 2650870083
X>2016-11-09 12:58:26.815; OpenInputDesktop HANDLE=408 with error 0 - The operation completed successfully
X>2016-11-09 12:58:26.815; SetThreadDesktop with error 0 - The operation completed successfully
X>2016-11-09 12:58:26.816; Current Desktop UOI_NAME = Winlogon Err code = 0 Desc = The operation completed successfully
X>2016-11-09 12:58:26.816; Success with error 0 - The operation completed successfully
X>2016-11-09 12:58:26.823; Desktop DC = 2650870083
X>2016-11-09 12:58:28.845; OpenInputDesktop HANDLE=416 with error 0 - The operation completed successfully
X>2016-11-09 12:58:28.846; SetThreadDesktop with error 0 - The operation completed successfully
X>2016-11-09 12:58:28.847; Current Desktop UOI_NAME = Default Err code = 0 Desc = The operation completed successfully
X>2016-11-09 12:58:28.849; Success with error 0 - The operation completed successfully
X>2016-11-09 12:58:28.859; Desktop DC = 2181107614
X>
X>Тоесть все переключается, но при этом скрины не скринятся
почему в логах разные десктопы default/winlogon
X>>Теперь первый раз OpenWindowStation возвращает 0 (ОК), а второй и последующие Err = 5 Access Denied
может оконная станция другая попробуй EnumWindowStations...
Так, не в десктопах значит дело. Проблема в том, что GetWindowsDesktop на Winlogon десктопе возвращает кактоето (не нулевое) неверное значение, и BitBlt заворачивается с ошибкой 5 The handle is invalid,
поискал окна, нашел это:
2016-11-09 19:40:24.491; Window found Handle = 9309174 Caption = Class = NativeHWNDHost
2016-11-09 19:40:24.491; Window found Handle = 594018 Caption = Windows sign-in Class = AUTHUI.DLL: LogonUI Logon Window
2016-11-09 19:40:24.492; Window found Handle = 3082386 Caption = Class = WorkerW
2016-11-09 19:40:24.492; Window found Handle = 32180828 Caption = Class = WorkerW
2016-11-09 19:40:24.492; Window found Handle = 3214588 Caption = Class = #32770
2016-11-09 19:40:24.493; Window found Handle = 21303450 Caption = MSCTFIME UI Class = MSCTFIME UI
2016-11-09 19:40:24.493; Window found Handle = 8585930 Caption = Default IME Class = IME
2016-11-09 19:40:24.493; Window found Handle = 8260028 Caption = Default IME Class = IME
GetDC(NativeHWNDHost) = BitBlt > The handle is invalid
GetDC(Windows sign-in Class) = BitBlt > The handle is invalid
GetDC(MSCTFIME UI Class) = BitBlt > The handle is invalid
Есть идеи?
Здравствуйте, xteam777, Вы писали:
X>Вообщем теперь ошибок никаких не выдает, но и вместо скринов винлогонв квадрат малевича, только белый. Код переключения десктопа такой: X>
X>2016-11-09 12:58:10.160; OpenInputDesktop HANDLE=368 with error 0 - The operation completed successfully
X>2016-11-09 12:58:10.160; SetThreadDesktop with error 0 - The operation completed successfully
X>2016-11-09 12:58:10.161; Current Desktop UOI_NAME = Default Ā ɠ+樀 Err code = 0 Desc = The operation completed successfully
X>2016-11-09 12:58:10.161; Success with error 0 - The operation completed successfully
X>2016-11-09 12:58:10.169; Desktop DC = 2231442227
X>2016-11-09 12:58:12.277; OpenInputDesktop HANDLE=36 with error 0 - The operation completed successfully
X>2016-11-09 12:58:12.277; SetThreadDesktop with error 0 - The operation completed successfully
X>2016-11-09 12:58:12.278; Current Desktop UOI_NAME = Default Ā ɠ+樀 Err code = 0 Desc = The operation completed successfully
X>2016-11-09 12:58:12.278; Success with error 0 - The operation completed successfully
X>2016-11-09 12:58:12.286; Desktop DC = 2231442227
X>2016-11-09 12:58:14.403; OpenInputDesktop HANDLE=384 with error 0 - The operation completed successfully
X>2016-11-09 12:58:14.404; SetThreadDesktop with error 0 - The operation completed successfully
X>2016-11-09 12:58:14.404; Current Desktop UOI_NAME = Winlogon Ā ɠ+樀+ Err code = 0 Desc = The operation completed successfully
X>2016-11-09 12:58:14.405; Success with error 0 - The operation completed successfully
X>2016-11-09 12:58:14.560; Desktop DC = 1090599179
X>2016-11-09 12:58:16.644; OpenInputDesktop HANDLE=392 with error 0 - The operation completed successfully
X>2016-11-09 12:58:16.644; SetThreadDesktop with error 0 - The operation completed successfully
X>2016-11-09 12:58:16.644; Current Desktop UOI_NAME = Winlogon Err code = 0 Desc = The operation completed successfully
X>2016-11-09 12:58:16.645; Success with error 0 - The operation completed successfully
X>2016-11-09 12:58:16.652; Desktop DC = 1426140622
X>2016-11-09 12:58:18.673; OpenInputDesktop HANDLE=40 with error 0 - The operation completed successfully
X>2016-11-09 12:58:18.673; SetThreadDesktop with error 0 - The operation completed successfully
X>2016-11-09 12:58:18.674; Current Desktop UOI_NAME = Winlogon Err code = 0 Desc = The operation completed successfully
X>2016-11-09 12:58:18.674; Success with error 0 - The operation completed successfully
X>2016-11-09 12:58:18.683; Desktop DC = 2650870083
X>2016-11-09 12:58:20.704; OpenInputDesktop HANDLE=372 with error 0 - The operation completed successfully
X>2016-11-09 12:58:20.704; SetThreadDesktop with error 0 - The operation completed successfully
X>2016-11-09 12:58:20.705; Current Desktop UOI_NAME = Winlogon Err code = 0 Desc = The operation completed successfully
X>2016-11-09 12:58:20.705; Success with error 0 - The operation completed successfully
X>2016-11-09 12:58:20.713; Desktop DC = 1392589891
X>2016-11-09 12:58:22.732; OpenInputDesktop HANDLE=396 with error 0 - The operation completed successfully
X>2016-11-09 12:58:22.733; SetThreadDesktop with error 0 - The operation completed successfully
X>2016-11-09 12:58:22.735; Current Desktop UOI_NAME = Winlogon Err code = 0 Desc = The operation completed successfully
X>2016-11-09 12:58:22.738; Success with error 0 - The operation completed successfully
X>2016-11-09 12:58:22.751; Desktop DC = 1392589891
X>2016-11-09 12:58:24.778; OpenInputDesktop HANDLE=404 with error 0 - The operation completed successfully
X>2016-11-09 12:58:24.779; SetThreadDesktop with error 0 - The operation completed successfully
X>2016-11-09 12:58:24.780; Current Desktop UOI_NAME = Winlogon Err code = 0 Desc = The operation completed successfully
X>2016-11-09 12:58:24.780; Success with error 0 - The operation completed successfully
X>2016-11-09 12:58:24.792; Desktop DC = 2650870083
X>2016-11-09 12:58:26.815; OpenInputDesktop HANDLE=408 with error 0 - The operation completed successfully
X>2016-11-09 12:58:26.815; SetThreadDesktop with error 0 - The operation completed successfully
X>2016-11-09 12:58:26.816; Current Desktop UOI_NAME = Winlogon Err code = 0 Desc = The operation completed successfully
X>2016-11-09 12:58:26.816; Success with error 0 - The operation completed successfully
X>2016-11-09 12:58:26.823; Desktop DC = 2650870083
X>2016-11-09 12:58:28.845; OpenInputDesktop HANDLE=416 with error 0 - The operation completed successfully
X>2016-11-09 12:58:28.846; SetThreadDesktop with error 0 - The operation completed successfully
X>2016-11-09 12:58:28.847; Current Desktop UOI_NAME = Default Err code = 0 Desc = The operation completed successfully
X>2016-11-09 12:58:28.849; Success with error 0 - The operation completed successfully
X>2016-11-09 12:58:28.859; Desktop DC = 2181107614
X>
X>Тоесть все переключается, но при этом скрины не скринятся
X>Здравствуйте, xteam777, Вы писали:
X>>Здравствуйте, xteam777, Вы писали:
X>>>Здравствуйте, xteam777, Вы писали:
X>>>>Здравствуйте, alexander_r, Вы писали:
_>>>>>Здравствуйте, xteam777, Вы писали:
X>>>>>>Запуск экзешника производится под пользователем SYSTEM. _>>>>>как вы запускаете экзешник под пользователем SYSTEM ??? какая-то служба наверное его запускает...
X>>>>>>В других версиях Windows все скрины получатся нормальными, а вот в Server 2012R2 если заблокировать комп (в это время скрины нормальные) и нажать на кнопку "Сменить пользователя" на экране блокировки, все дальшейшие скрины получаются пустыми (полностью белая заливка). Может кто подскажет в какую сторону копать? _>>>>>скорее всего экзешник запускается на другом рабочем столе, не на winlogon
X>>>>В Win10 удалось победить. Эксешник запускается под пользователем SYSTEM.
X>>>>Перед каждым снятием скриншота я запускаю такую процедуру(код сырой, но работает, потом причешу): X>>>>Но с Server 2012R2 проблема осталась, на остальных терминалах не проверял. Посоветуете куда дальше копать? X>>>>
X>>>>function SetWinSta0Desktop: Boolean;
X>>>>var
X>>>> bSuccess: Boolean;
X>>>> hWinSta0: HWINSTA;
X>>>> hDesktop: HDESK;
X>>>> err: LongInt;
X>>>>begin
X>>>> bSuccess := False;
X>>>> hWinSta0 := OpenWindowStation('WinSta0', False, GENERIC_ALL);
X>>>> if hWinSta0 = 0 then
X>>>> begin
X>>>> err := GetLastError;
X>>>> xLog('OpenWindowStation Err code = ' + IntToStr(err) + ' Desc = ' + SysErrorMessage(err));
X>>>> end;
X>>>> bSuccess := SetProcessWindowStation(hWinSta0);
X>>>> if not bSuccess then
X>>>> begin
X>>>> err := GetLastError;
X>>>> xLog('SetProcessWindowStation Err code = ' + IntToStr(err) + ' Desc = ' + SysErrorMessage(err));
X>>>> end;
X>>>> //hDesktop := OpenDesktop(szDesktopName, 0, False, GENERIC_ALL);
X>>>> hDesktop := OpenInputDesktop(DF_ALLOWOTHERACCOUNTHOOK, False, MAXIMUM_ALLOWED);
X>>>> if hDesktop = 0 then
X>>>> begin
X>>>> err := GetLastError;
X>>>> xLog('OpenInputDesktop Err code = ' + IntToStr(err) + ' Desc = ' + SysErrorMessage(err));
X>>>> end;
X>>>> bSuccess := SetThreadDesktop(hDesktop);
X>>>> if not bSuccess then
X>>>> begin
X>>>> err := GetLastError;
X>>>> xLog('SetThreadDesktop Err code = ' + IntToStr(err) + ' Desc = ' + SysErrorMessage(err));
X>>>> end;
X>>>> if hDesktop <> 0 then
X>>>> CloseDesktop(hDesktop);
X>>>> if hWinSta0 <> 0 then
X>>>> CloseWindowStation(hWinSta0);
X>>>>// if bSuccess then
X>>>>// ShowLastErrorMessage(0, 'Success')
X>>>>// else
X>>>>// ShowLastErrorMessage(0, 'Failed');
X>>>> Result := bSuccess;
X>>>>end;
X>>>>
X>>>Забыл добавить. Проблема в этой строке: X>>>hWinSta0 := OpenWindowStation('WinSta0', False, GENERIC_ALL); X>>>Err = 5 Access Denied. Что не так не пойму
X>>Добавил перед проблемной строкой строку: X>>
X>>RpcImpersonateClient(nil);
X>>
X>>Теперь первый раз OpenWindowStation возвращает 0 (ОК), а второй и последующие Err = 5 Access Denied
Разные десктопы, потому что я специально делаю LoskWorkstation > UnLoskWorkstation для полноты эесперимента, тред правильно определяет текущий десктоп и переключается на него, а вот с BitBlt беда
Здравствуйте, alexander_r, Вы писали:
_>Здравствуйте, xteam777, Вы писали: X>>В логах видно следующее: X>>
X>>2016-11-09 12:58:10.160; OpenInputDesktop HANDLE=368 with error 0 - The operation completed successfully
X>>2016-11-09 12:58:10.160; SetThreadDesktop with error 0 - The operation completed successfully
X>>2016-11-09 12:58:10.161; Current Desktop UOI_NAME = Default Ā ɠ+樀 Err code = 0 Desc = The operation completed successfully
X>>2016-11-09 12:58:10.161; Success with error 0 - The operation completed successfully
X>>2016-11-09 12:58:10.169; Desktop DC = 2231442227
X>>2016-11-09 12:58:12.277; OpenInputDesktop HANDLE=36 with error 0 - The operation completed successfully
X>>2016-11-09 12:58:12.277; SetThreadDesktop with error 0 - The operation completed successfully
X>>2016-11-09 12:58:12.278; Current Desktop UOI_NAME = Default Ā ɠ+樀 Err code = 0 Desc = The operation completed successfully
X>>2016-11-09 12:58:12.278; Success with error 0 - The operation completed successfully
X>>2016-11-09 12:58:12.286; Desktop DC = 2231442227
X>>2016-11-09 12:58:14.403; OpenInputDesktop HANDLE=384 with error 0 - The operation completed successfully
X>>2016-11-09 12:58:14.404; SetThreadDesktop with error 0 - The operation completed successfully
X>>2016-11-09 12:58:14.404; Current Desktop UOI_NAME = Winlogon Ā ɠ+樀+ Err code = 0 Desc = The operation completed successfully
X>>2016-11-09 12:58:14.405; Success with error 0 - The operation completed successfully
X>>2016-11-09 12:58:14.560; Desktop DC = 1090599179
X>>2016-11-09 12:58:16.644; OpenInputDesktop HANDLE=392 with error 0 - The operation completed successfully
X>>2016-11-09 12:58:16.644; SetThreadDesktop with error 0 - The operation completed successfully
X>>2016-11-09 12:58:16.644; Current Desktop UOI_NAME = Winlogon Err code = 0 Desc = The operation completed successfully
X>>2016-11-09 12:58:16.645; Success with error 0 - The operation completed successfully
X>>2016-11-09 12:58:16.652; Desktop DC = 1426140622
X>>2016-11-09 12:58:18.673; OpenInputDesktop HANDLE=40 with error 0 - The operation completed successfully
X>>2016-11-09 12:58:18.673; SetThreadDesktop with error 0 - The operation completed successfully
X>>2016-11-09 12:58:18.674; Current Desktop UOI_NAME = Winlogon Err code = 0 Desc = The operation completed successfully
X>>2016-11-09 12:58:18.674; Success with error 0 - The operation completed successfully
X>>2016-11-09 12:58:18.683; Desktop DC = 2650870083
X>>2016-11-09 12:58:20.704; OpenInputDesktop HANDLE=372 with error 0 - The operation completed successfully
X>>2016-11-09 12:58:20.704; SetThreadDesktop with error 0 - The operation completed successfully
X>>2016-11-09 12:58:20.705; Current Desktop UOI_NAME = Winlogon Err code = 0 Desc = The operation completed successfully
X>>2016-11-09 12:58:20.705; Success with error 0 - The operation completed successfully
X>>2016-11-09 12:58:20.713; Desktop DC = 1392589891
X>>2016-11-09 12:58:22.732; OpenInputDesktop HANDLE=396 with error 0 - The operation completed successfully
X>>2016-11-09 12:58:22.733; SetThreadDesktop with error 0 - The operation completed successfully
X>>2016-11-09 12:58:22.735; Current Desktop UOI_NAME = Winlogon Err code = 0 Desc = The operation completed successfully
X>>2016-11-09 12:58:22.738; Success with error 0 - The operation completed successfully
X>>2016-11-09 12:58:22.751; Desktop DC = 1392589891
X>>2016-11-09 12:58:24.778; OpenInputDesktop HANDLE=404 with error 0 - The operation completed successfully
X>>2016-11-09 12:58:24.779; SetThreadDesktop with error 0 - The operation completed successfully
X>>2016-11-09 12:58:24.780; Current Desktop UOI_NAME = Winlogon Err code = 0 Desc = The operation completed successfully
X>>2016-11-09 12:58:24.780; Success with error 0 - The operation completed successfully
X>>2016-11-09 12:58:24.792; Desktop DC = 2650870083
X>>2016-11-09 12:58:26.815; OpenInputDesktop HANDLE=408 with error 0 - The operation completed successfully
X>>2016-11-09 12:58:26.815; SetThreadDesktop with error 0 - The operation completed successfully
_>X>2016-11-09 12:58:26.816; Current Desktop UOI_NAME = Winlogon Err code = 0 Desc = The operation completed successfully
X>>2016-11-09 12:58:26.816; Success with error 0 - The operation completed successfully
X>>2016-11-09 12:58:26.823; Desktop DC = 2650870083
X>>2016-11-09 12:58:28.845; OpenInputDesktop HANDLE=416 with error 0 - The operation completed successfully
X>>2016-11-09 12:58:28.846; SetThreadDesktop with error 0 - The operation completed successfully
_>X>2016-11-09 12:58:28.847; Current Desktop UOI_NAME = Default Err code = 0 Desc = The operation completed successfully
X>>2016-11-09 12:58:28.849; Success with error 0 - The operation completed successfully
X>>2016-11-09 12:58:28.859; Desktop DC = 2181107614
X>>
X>>Тоесть все переключается, но при этом скрины не скринятся _>почему в логах разные десктопы default/winlogon
X>>>Теперь первый раз OpenWindowStation возвращает 0 (ОК), а второй и последующие Err = 5 Access Denied _>может оконная станция другая попробуй EnumWindowStations...