View Full Version : سوال: Restart كردن ويندوز
A_Salimi
یک شنبه 31 خرداد 1388, 12:54 عصر
سلام
من قصد دارم ويندوز را با ExitWindowEx ريست كنم اما مشكلي كه وجود دارد اين است كه در پارامتر اول از هر فلگي كه استفاده مي كنم (مخصوصا EWX_REBOOT) ويندوز Log off مي شود.پارامتر دوم هم 0 قرار مي دهم.
لطفا كسي بگه مشكل كجاست و چرا نمي تونم كامپيوتر را ريست كنم؟
Nima_NF
یک شنبه 31 خرداد 1388, 13:21 عصر
وقتی تابعی دو پارامتر دارد، خیلی راحت به جای اینکه مقادیر صفر قرار دهید آن ها را مقدار دهی کنید تا ببینید مشکل بر طرف می شود یا نه. پس در مورد شما پارامتر دوم را باید با توجه به دلیل restart تعیین کنید، مثلا:
ExitWindowsEx(EWX_REBOOT | EWX_FORCE,
SHTDN_REASON_MAJOR_OTHER |
SHTDN_REASON_MINOR_OTHER |
SHTDN_REASON_FLAG_PLANNED );
A_Salimi
یک شنبه 31 خرداد 1388, 18:41 عصر
حداقل براي ويندوز من كه هيچ تغييري نكرد .باز هم ويندوز Log off شد.
به جز توابع Api آيا تابع ديگري هم وجود دارد كه اين كار را انجام بدهد ؟
ضمنا اين نكته رو هم يادم رفت بگم :ExitWindowsEx اصلا هيچ كاري نميكنه زماني كه ازExitWindows استفاده مي كنم Log off ميشه.چرا اينطوريه ؟
Nima_NF
یک شنبه 31 خرداد 1388, 20:45 عصر
تابع ExitWindows کارش فقط log off کردن هست، دو پارمتر آن هیچ کاری نمی کنند و باید صفر باشند.
شما باید از تابع ExitWindowsEx استفاده کنید، حتی برنامه های .NET هم از این تابع استفاده می کنند.
کاری که حتما شما انجام ندادید اضافه کردن حق دسترسی SE_SHUTDOWN_NAME برای پروسه هست. بدون آن تابع فوق خطا بر می گرداند و عمل مورد نظر انجام نمی شود.
اگر قرار هست برنامه شما عمل shutdown یا restart انجام دهد باید با LookupPrivilegeValue حق دسترسی SE_SHUTDOWN_NAME را بگیرید و سپس با AdjustTokenPrivileges و TOKEN دریافت شده قبلی به همراه فلگ SE_PRIVILEGE_ENABLED این حق دسترسی را فعال کنید تا عمل مورد نظر شما انجام شود.
پس قبل از ExitWindowsEx بنویسید:
HANDLE hToken;
TOKEN_PRIVILEGES tkp;
if (!OpenProcessToken(GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
return( FALSE );
LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME ,
&tkp.Privileges[0].Luid);
tkp.PrivilegeCount = 1; // one privilege to set
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,
(PTOKEN_PRIVILEGES)NULL, 0);
این مورد در MSDN نیز مثال زده شده است.
A_Salimi
دوشنبه 01 تیر 1388, 16:37 عصر
با تشكر.
بايد بگم اين تابع به تنهايي ممكنه نتونه سيستم را ريست كند.
كد زير در MSDN به دادم رسيد :(البته با تغييراتي كه در آن دادم)
BOOL CUsernameDlg::Reset()
{
HANDLE hToken;
TOKEN_PRIVILEGES tkp;
// Get a token for this process.
if (!OpenProcessToken(GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
return( FALSE );
// Get the LUID for the shutdown privilege.
LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME ,
&tkp.Privileges[0].Luid);
tkp.PrivilegeCount = 1; // one privilege to set
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
// Get the shutdown privilege for this process.
AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,
(PTOKEN_PRIVILEGES)NULL, 0);
if (GetLastError() != ERROR_SUCCESS)
return FALSE;
// Shut down the system and force all applications to close.
if (!ExitWindowsEx(EWX_REBOOT | EWX_FORCE,
0x00020000 |
0x00000003 |
0x80000000))
return FALSE;
return TRUE;
}
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.