lib_win.php 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  1. <?php
  2. if(!defined('WIN32_ERROR_ACCESS_DENIED')) define('WIN32_ERROR_ACCESS_DENIED',0x00000005);
  3. if(!defined('WIN32_ERROR_CIRCULAR_DEPENDENCY')) define('WIN32_ERROR_CIRCULAR_DEPENDENCY',0x00000423);
  4. if(!defined('WIN32_ERROR_DATABASE_DOES_NOT_EXIST')) define('WIN32_ERROR_DATABASE_DOES_NOT_EXIST',0x00000429);
  5. if(!defined('WIN32_ERROR_DEPENDENT_SERVICES_RUNNING')) define('WIN32_ERROR_DEPENDENT_SERVICES_RUNNING',0x0000041B);
  6. if(!defined('WIN32_ERROR_DUPLICATE_SERVICE_NAME')) define('WIN32_ERROR_DUPLICATE_SERVICE_NAME',0x00000436);
  7. if(!defined('WIN32_ERROR_FAILED_SERVICE_CONTROLLER_CONNECT')) define('WIN32_ERROR_FAILED_SERVICE_CONTROLLER_CONNECT',0x00000427);
  8. if(!defined('WIN32_ERROR_INSUFFICIENT_BUFFER')) define('WIN32_ERROR_INSUFFICIENT_BUFFER',0x0000007A);
  9. if(!defined('WIN32_ERROR_INVALID_DATA')) define('WIN32_ERROR_INVALID_DATA',0x0000000D);
  10. if(!defined('WIN32_ERROR_INVALID_HANDLE')) define('WIN32_ERROR_INVALID_HANDLE',0x00000006);
  11. if(!defined('WIN32_ERROR_INVALID_LEVEL')) define('WIN32_ERROR_INVALID_LEVEL',0x0000007C);
  12. if(!defined('WIN32_ERROR_INVALID_NAME')) define('WIN32_ERROR_INVALID_NAME',0x0000007B);
  13. if(!defined('WIN32_ERROR_INVALID_PARAMETER')) define('WIN32_ERROR_INVALID_PARAMETER',0x00000057);
  14. if(!defined('WIN32_ERROR_INVALID_SERVICE_ACCOUNT')) define('WIN32_ERROR_INVALID_SERVICE_ACCOUNT',0x00000421);
  15. if(!defined('WIN32_ERROR_INVALID_SERVICE_CONTROL')) define('WIN32_ERROR_INVALID_SERVICE_CONTROL',0x0000041C);
  16. if(!defined('WIN32_ERROR_PATH_NOT_FOUND')) define('WIN32_ERROR_PATH_NOT_FOUND',0x00000003);
  17. if(!defined('WIN32_ERROR_SERVICE_ALREADY_RUNNING')) define('WIN32_ERROR_SERVICE_ALREADY_RUNNING',0x00000420);
  18. if(!defined('WIN32_ERROR_SERVICE_CANNOT_ACCEPT_CTRL')) define('WIN32_ERROR_SERVICE_CANNOT_ACCEPT_CTRL',0x00000425);
  19. if(!defined('WIN32_ERROR_SERVICE_DATABASE_LOCKED')) define('WIN32_ERROR_SERVICE_DATABASE_LOCKED',0x0000041F);
  20. if(!defined('WIN32_ERROR_SERVICE_DEPENDENCY_DELETED')) define('WIN32_ERROR_SERVICE_DEPENDENCY_DELETED',0x00000433);
  21. if(!defined('WIN32_ERROR_SERVICE_DEPENDENCY_FAIL')) define('WIN32_ERROR_SERVICE_DEPENDENCY_FAIL',0x0000042C);
  22. if(!defined('WIN32_ERROR_SERVICE_DISABLED')) define('WIN32_ERROR_SERVICE_DISABLED',0x00000422);
  23. if(!defined('WIN32_ERROR_SERVICE_DOES_NOT_EXIST')) define('WIN32_ERROR_SERVICE_DOES_NOT_EXIST',0x00000424);
  24. if(!defined('WIN32_ERROR_SERVICE_EXISTS')) define('WIN32_ERROR_SERVICE_EXISTS',0x00000431);
  25. if(!defined('WIN32_ERROR_SERVICE_LOGON_FAILED')) define('WIN32_ERROR_SERVICE_LOGON_FAILED',0x0000042D);
  26. if(!defined('WIN32_ERROR_SERVICE_MARKED_FOR_DELETE')) define('WIN32_ERROR_SERVICE_MARKED_FOR_DELETE',0x00000430);
  27. if(!defined('WIN32_ERROR_SERVICE_NO_THREAD')) define('WIN32_ERROR_SERVICE_NO_THREAD',0x0000041E);
  28. if(!defined('WIN32_ERROR_SERVICE_NOT_ACTIVE')) define('WIN32_ERROR_SERVICE_NOT_ACTIVE',0x00000426);
  29. if(!defined('WIN32_ERROR_SERVICE_REQUEST_TIMEOUT')) define('WIN32_ERROR_SERVICE_REQUEST_TIMEOUT',0x0000041D);
  30. if(!defined('WIN32_ERROR_SHUTDOWN_IN_PROGRESS')) define('WIN32_ERROR_SHUTDOWN_IN_PROGRESS',0x0000045B);
  31. if(!defined('WIN32_NO_ERROR')) define('WIN32_NO_ERROR',0x00000000);
  32. if(function_exists('win32_query_service_status')){
  33. class win_service{
  34. private static $service_state = array(
  35. //Service Status Constants
  36. WIN32_SERVICE_CONTINUE_PENDING =>'CONTINUE_PENDING',
  37. WIN32_SERVICE_PAUSE_PENDING =>'PAUSE_PENDING',
  38. WIN32_SERVICE_PAUSED =>'PAUSED',
  39. WIN32_SERVICE_RUNNING =>'RUNNING',
  40. WIN32_SERVICE_START_PENDING =>'START_PENDING',
  41. WIN32_SERVICE_STOP_PENDING =>'STOP_PENDING',
  42. WIN32_SERVICE_STOPPED =>'STOPPED',
  43. );
  44. private static $win_error = array(
  45. WIN32_NO_ERROR => 'NO_ERROR',
  46. WIN32_ERROR_ACCESS_DENIED => 'ACCESS_DENIED',
  47. WIN32_ERROR_CIRCULAR_DEPENDENCY => 'CIRCULAR_DEPENDENCY',
  48. WIN32_ERROR_DATABASE_DOES_NOT_EXIST => 'DATABASE_DOES_NOT_EXIST',
  49. WIN32_ERROR_DEPENDENT_SERVICES_RUNNING => 'DEPENDENT_SERVICES_RUNNING',
  50. WIN32_ERROR_DUPLICATE_SERVICE_NAME => 'DUPLICATE_SERVICE_NAME',
  51. WIN32_ERROR_FAILED_SERVICE_CONTROLLER_CONNECT => 'FAILED_SERVICE_CONTROLLER_CONNECT',
  52. WIN32_ERROR_INSUFFICIENT_BUFFER => 'INSUFFICIENT_BUFFER',
  53. WIN32_ERROR_INVALID_DATA => 'INVALID_DATA',
  54. WIN32_ERROR_INVALID_HANDLE => 'INVALID_HANDLE',
  55. WIN32_ERROR_INVALID_LEVEL => 'INVALID_LEVEL',
  56. WIN32_ERROR_INVALID_NAME => 'INVALID_NAME',
  57. WIN32_ERROR_INVALID_PARAMETER => 'INVALID_PARAMETER',
  58. WIN32_ERROR_INVALID_SERVICE_ACCOUNT => 'INVALID_SERVICE_ACCOUNT',
  59. WIN32_ERROR_INVALID_SERVICE_CONTROL => 'INVALID_SERVICE_CONTROL',
  60. WIN32_ERROR_PATH_NOT_FOUND => 'PATH_NOT_FOUND',
  61. WIN32_ERROR_SERVICE_ALREADY_RUNNING => 'SERVICE_ALREADY_RUNNING',
  62. WIN32_ERROR_SERVICE_CANNOT_ACCEPT_CTRL => 'SERVICE_CANNOT_ACCEPT_CTRL',
  63. WIN32_ERROR_SERVICE_DATABASE_LOCKED => 'SERVICE_DATABASE_LOCKED',
  64. WIN32_ERROR_SERVICE_DEPENDENCY_DELETED => 'SERVICE_DEPENDENCY_DELETED',
  65. WIN32_ERROR_SERVICE_DEPENDENCY_FAIL => 'SERVICE_DEPENDENCY_FAIL',
  66. WIN32_ERROR_SERVICE_DISABLED => 'SERVICE_DISABLED',
  67. WIN32_ERROR_SERVICE_DOES_NOT_EXIST => 'SERVICE_DOES_NOT_EXIST',
  68. WIN32_ERROR_SERVICE_EXISTS => 'SERVICE_EXISTS',
  69. WIN32_ERROR_SERVICE_LOGON_FAILED => 'SERVICE_LOGON_FAILED',
  70. WIN32_ERROR_SERVICE_MARKED_FOR_DELETE => 'SERVICE_MARKED_FOR_DELETE',
  71. WIN32_ERROR_SERVICE_NO_THREAD => 'SERVICE_NO_THREAD',
  72. WIN32_ERROR_SERVICE_NOT_ACTIVE => 'SERVICE_NOT_ACTIVE',
  73. WIN32_ERROR_SERVICE_REQUEST_TIMEOUT => 'SERVICE_REQUEST_TIMEOUT',
  74. WIN32_ERROR_SHUTDOWN_IN_PROGRESS => 'SHUTDOWN_IN_PROGRESS'
  75. );
  76. private static function val2val($val,$map,$default){
  77. if(isset($map[$val])) return $map[$val];
  78. return $default;
  79. }
  80. var $status;
  81. var $last_error;
  82. var $name;
  83. var $description;
  84. var $machine;
  85. function win_service($srvname, $machine=null){
  86. $this->name = $srvname;
  87. $this->machine = $machine;
  88. $this->status = null;
  89. $this->last_error = WIN32_NO_ERROR;
  90. }
  91. function refresh_status(){
  92. $status = win32_query_service_status($this->name,$this->machine);
  93. if(is_array($status)){
  94. $this->status = (object)$status;
  95. $this->last_error = WIN32_NO_ERROR;
  96. return true;
  97. }
  98. $this->status = null;
  99. $last_error = $status;
  100. return false;
  101. }
  102. function start(){
  103. $this->last_error = win32_start_service($this->name, $this->machine);
  104. return ($this->last_error === WIN32_NO_ERROR) or ($this->last_error === WIN32_ERROR_SERVICE_ALREADY_RUNNING);
  105. }
  106. function stop(){
  107. $this->last_error = win32_stop_service($this->name, $this->machine);
  108. return $this->last_error === WIN32_NO_ERROR;
  109. }
  110. function last_error($as_string = true){
  111. if($as_string){
  112. return self::val2val(
  113. $this->last_error, self::$win_error, $this->last_error
  114. );
  115. }
  116. return $this->last_error;
  117. }
  118. function state($as_string = true){
  119. if((!$this->status)and(!$this->refresh_status())) return false;
  120. if($as_string){
  121. return self::val2val(
  122. $this->status->CurrentState, self::$service_state, 'UNKNOWN'
  123. );
  124. }
  125. return $this->status->CurrentState;
  126. }
  127. function pid(){
  128. if((!$this->status)and(!$this->refresh_status())) return false;
  129. return $this->status->ProcessId;
  130. }
  131. }
  132. }
  133. if(function_exists('reg_open_key')){
  134. class win_reg_key{
  135. private static $HK = array(
  136. HKEY_CLASSES_ROOT => "HKCR",
  137. HKEY_CURRENT_USER => "HKCU",
  138. HKEY_LOCAL_MACHINE => "HKLM",
  139. HKEY_USERS => "HKU",
  140. HKEY_CURRENT_CONFIG => "HKCC",
  141. );
  142. function __construct($haiv, $key){
  143. $this->h = $haiv;
  144. $this->k = $key;
  145. $this->r = reg_open_key($this->h, $this->k);
  146. $this->shell = new COM('WScript.Shell');
  147. if(!$this->shell){
  148. throw new Exception("Cannot create shell object.");
  149. }
  150. if(!$this->r){
  151. throw new Exception("Cannot access registry.");
  152. }
  153. $this->path = self::$HK[$this->h] . '\\' . $this->k;
  154. }
  155. function __destruct(){
  156. if($this->r){
  157. reg_close_key($this->r);
  158. $this->r = false;
  159. }
  160. }
  161. function keys(){
  162. return reg_enum_key($this->r);
  163. }
  164. function values($as_hash = false){
  165. $values = reg_enum_value($this->r);
  166. if(!$as_hash) return $values;
  167. $result = Array();
  168. foreach($values as $key){
  169. $result[$key] = reg_get_value($this->r, $key);
  170. }
  171. return $result;
  172. }
  173. function value($key){
  174. return reg_get_value($this->r, $key);
  175. }
  176. function exists($key){
  177. $v = $this->value($key);
  178. if($v === NULL) return false;
  179. if($v === false) return false;
  180. return true;
  181. }
  182. private function write_raw($key, $type, $value){
  183. return reg_set_value($this->r, $key, $type, $value);
  184. }
  185. function write_dword($key, $value){
  186. return $this->write_raw($key, REG_DWORD, $value);
  187. }
  188. function write_string($key, $value){
  189. return $this->write_raw($key, REG_SZ, $value);
  190. }
  191. function remove_value($key){
  192. if(!$this->exists($key)) return;
  193. $key = $this->path . '\\' . $key;
  194. $this->shell->RegDelete($key);
  195. }
  196. }
  197. }