Tam Sürümünü Görmek İçin : ExitWindowsEx ile bilgisayarı kapatmak.
Ben c# kodları kullaraka sistemi yeniden başlatmak yada kapatmak istiyorum.
user32.dll'i kullanıyorum ama istediğim sonucu alamadım.
kullandığın metodun prototipi şöyle:
BOOL ExitWindowsEx(UINT uFlags,DWORD dwReason)
using System;
using System.Runtime.InteropServices;
namespace ConsoleApplication16
{
class Class1
{
[DllImport("user32.dll")]
public static extern bool ExitWindowsEx(uint uFlags,long dwReason);
static void Main(string[] args)
{
ExitWindowsEx(1,0);
}
}
}
ExitWindowsEx(2,0);
ExitWindowsEx(4,0);
ExitWindowsEx(8,0);
denememe rağmen sonuş alamadım.Sadece kullanıcı oturumunu kapatıyor.
acehreli
10/12/2005, 02:51
Ben olsam 1 gibi anlasilmaz degerler yerine onlarin anlamli karsiliklarini kullanirdim. Microsoft'un da o degerleri neden belgelerde acikladigini anlamiyorum. Su cok daha iyi:
ExitWindowsEx(EWX_SHUTDOWN, 0);
Aslinda 0 kullanmayi onermisler ama onun da guzel bir adi var:
ExitWindowsEx(EWX_SHUTDOWN, SHTDN_REASON_MINOR_OTHER);
Bunlari sorunun yanitini bildigimden soylemiyorum :) Anladigim tek sey, bu cagriyi yapan programin (process'in) SE_SHUTDOWN_NAME ayricaliginin (privilege) bulunmasi gerekiyormus...
Ali
Anladigim tek sey, bu cagriyi yapan programin (process'in) SE_SHUTDOWN_NAME ayricaliginin (privilege) bulunmasi gerekiyormus...
Ali
Zaten o ayrıcalık bambaşka bir bela.Baya karışık geldi bana.Örnek buldum ama...
http://www.lowesoftware.com/modules.php?op=modload&name=News&file=article&sid=14&mode=thread&order=0&thold=0
dreammaker
10/12/2005, 07:33
c#
Bilgisayarı kapatmak / yeniden baslatmak için...
System.Diagnostics.Process proc = new System.Diagnostics.Process();
proc.EnableRaisingEvents=false;
proc.StartInfo.FileName="Shutdown.exe";
proc.StartInfo.Arguments="-r";
proc.Start();
proc.StartInfo.Arguments= "-r" yeniden başlat "-s" kapat
MSDN ExitWindowsEx islevinin hazirdaki kullaniciyi log off yapmak, sistemi kapatmak, veya sistemi kapatip tekrar acmak amaclari ile kullanilabilecegini soyler. WM_QUERYSESSION mesajini calismakta olan butun programlara gondererek durdurulup durdurulamayacaklarini belirler.
BOOL ExitWindowsEx(
UINT uFlags, // shutdown operation
DWORD dwReserved // reserved
);
Geri donus degeri 0 ise GetLastError islevi ile ne tur bir hata oldugu hakkinda bilgi edinebilirsiniz.
uFlags
EWX_LOGOFF ExitWindowsEx i cagiran process in guvenlik kapsaminda Calismakta olan butun process ler kapatilir ve kullanicin oturumu kapatilir.
EWX_POWEROFF Sistemi ve gucu kapatir. Cagiran programin SE_SHUTDOWN_NAME ayricaligina sahip olmasi gerekir.
EWX_REBOOT Sistemi kapatip acar. SE_SHUTDOWN_NAME gerekli.
EWX_SHUTDOWN Sistemi bir noktaya kadar kapatir. SE_SHUTDOWN_NAME gerekli.
Bu parametre ayrica asagadaki iki parametre ile birlikte kullanilabilir.
EWX_FORCE Programlari kapanmaya zorlar. Bu deger verildiginde system WM_QUERYSESSION ve WM_ENDSESSION mesajlari gonderilmeyeceginden programlarin data kaybina ugramasi muhtemeldir.
[B]EWX_FORCEIFHUNG[B] Eger program WM_QUERYSESSION ve WM_ENDSESSION mesajlarina cevap vermezse bu programi kapanmaya zorlar.
dwReserved
Bu parametre dikkate alinmaz.
Bu noktadan sonra ExitWindowsEx islevini kullanabilmek icin anlamamiz gereken ayricaliklar nedir. Cunki bir kullanici oturum actiginda yapabilecekleri bu kullanicinin sahip oldugu ayricaliklara baglidir. Bir baska deyisle bu kullanici altinda calistirdigimiz programlarin yapabilecekleride tamamen bu kullanicin sahip oldugu ayriciliklarla sinirlidir. Ornegin ExitWindowEx islevini EWX_LOGOFF degeri ile cagirirsaniz buyuk bir ihtimalle sorun cikarmadan calisacaktir cunki her kullanici log off olma ayricaligina sahiptir. Bu arada akliniza herhangi bir kullanici calistira gidip kapat derse kapaniyor gibi bir soru gelebilir ki bunun nedeni kapatma komutunun sistem tarafindan calistiriliyor olmasi. Bu problemini cozmenin bir yolu programimizin sahip olmadigi bu ayricaligi saglamak. Bunu saglamak icin ilk yapmamiz gereken calisma aninda programimizin nerde oldugunu bulmak. Bunu basarmak icin butun gereken GetCurrentProcess Win32 API islevini cagirmak ve bu islevin dondugu handle i saklamak. Ikinci step elde ettigimiz handle i kullanarak programimiza gerekli ayricaligi vermek. Bunu basarmak icin de bir baska API islevi olan OpenProcessToken u kullanmak yeteri.
hdlProcessHandle = GetCurrentProcess()
BOOL OpenProcessToken(
HANDLE ProcessHandle, // GetCurrentProcess islevinden donen deger
DWORD DesiredAccess, // Istedigimiz hak TOKEN_ADJUST_PRIVILEGES olmali
PHANDLE TokenHandle // Yeni acilan token a ulasabilmemiz icin isaretci
);
Isaretcimizi elde ettikten sonra sira SeShutdownPrivilegees(SE_SHUTDOWN_NAME ) ayricaligina ulasabilmek icin gerekli LUID yi elde etmek. LUID (Locally unique idendifier yada turkceye cevirmeye calisirsam programin calistigi bilgisayarda esi olmadigi garantilenen 64 bit tanimlayici)
LUID yi elde etmek icinde LookupPrivilegeValue API islevini kullanmak gerekli.
BOOL LookupPrivilegeValue(
LPCTSTR lpSystemName, //hangi sistemde bakmak icin. 0 ise yerel sistem
LPCTSTR lpName, // ayricaligin ismi SeShutdownPrivilegees veya SE_SHUTDOWN_NAME
PLUID lpLuid // LUID nin adresi (degiskene isaretci)
);
Son olarakta AdjustTokenPrivileges API islevini kullanarak arzu ettigimiz ayricaligi aktif etmek.
TOKEN_PRIVILEGES NewState
NewState.PrivilegeCount=1; // Sadece 1 tek ayricalik degistirmek istiyoruz
NewState.Luid=lpLuid;
NewState..Attributes=SE_PRIVILEGE_ENABLED;
BOOL AdjustTokenPrivileges(
HANDLE TokenHandle, // Daha once elde ettigimiz token
BOOL DisableAllPrivileges, // Butun ayricaliklari engelleyebilmek icin flag
PTOKEN_PRIVILEGES NewState, // Yeni ayricalikara isaretci
DWORD BufferLength, // byte olarak yeni ayricalik buffer size i
PTOKEN_PRIVILEGES PreviousState, // ayricalik orjinal hali
PDWORD ReturnLength // orjinal buffer a gerekli size
);
C# tan pek anlamadigim icin sadece WIN32 API fonksiyonlarini aciklamaya calistim ama pekte net bir ifade olmadi. Umarim iyi kotu bir ise yarar.
acehreli
11/12/2005, 00:24
Sabahi, sen eski bir belgeye bakiyorsun belki de. Cunku su adresten anlasildigina gore, eskiden dikkate alinmayan parametre artik "kapatma nedeni" gorevini ustlenmis:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sysinfo/base/exitwindowsex.asp
Ali
acehreli uyari icin tesekkurler. Haklisin artik kapatma nedeni olarak kullaniliyor.
yastasinane
14/12/2005, 23:04
microsoft'un sitesinden aldigim kodlar (tabiki privilege);
bool Kapat(unsigned uiGorev)
{
HANDLE hToken;
TOKEN_PRIVILEGES tprivilege;
if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
return false;
LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tprivilege.Privileges[0].Luid);
tprivilege.PrivilegeCount = 1; // ilkine konumlan..
tprivilege.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken, FALSE, &tprivilege, 0, (PTOKEN_PRIVILEGES)NULL, 0);
if (GetLastError() != ERROR_SUCCESS)
return false;
if (!ExitWindowsEx(uiGorev, 0xFFFFFFFF)) // Tüm uygulamaları kapat sonra sistemi...
return false;
return true;
}
bu arada;
/* uiGorev....
#define EWX_LOGOFF 0
#define EWX_SHUTDOWN 0x00000001
#define EWX_REBOOT 0x00000002
#define EWX_FORCE 0x00000004
#define EWX_POWEROFF 0x00000008
#if(_WIN32_WINNT >= 0x0500)
#define EWX_FORCEIFHUNG 0x00000010
*/
bool tanimladiktan sonra gerekli olan kod ;
Kapat(10);
ancak bu kod kullanildiginda kaydedilmemis bir dosya varsa bilg. kapanmiyor onay bekliyor, bende bir deneme yaptim 12 kullandim oldu.
yani;
Kapat(12);
ben bu kodlari c++ da kullandim. c# da da oluyor olmasi lazim.
kolay gelsin...
Forum Yazılımı : vBulletin v3.6.8, Copyright ©2000-2008, Jelsoft Enterprises Ltd.