|    
			
				02/02/2004, 15:11
			
			
			  | 
  |   |  |  |  Fecha de Ingreso: diciembre-2003 
						Mensajes: 288
					 Antigüedad: 21 años, 10 meses Puntos: 0 |  | 
  |  Por cierto si quieres trabajar con el codigo q te di, si q funciona pero utiliza ad+ la api AdjustTokenPrivileges, te paso un ejemplo q he echo utilizando esta misma api pero para reiniciar el ordenador ahi va:
 Option Explicit
 
 ' CONSTANTES Y DECLARACIONES PARA SALIR DE WINDOWS
 
 ' Cerrar todos los programas e iniciar la sesión como
 
 ' un usuario distinto
 
 Private Const EWX_LOGOFF = 0
 
 ' Apagar el equipo
 
 Private Const EWX_SHUTDOWN As Long = 1
 
 ' Reiniciar el equipo
 
 Private Const EWX_REBOOT = 2
 
 ' Forzar el apagado. Los ficheros abiertos se pueden perder. Las
 
 ' aplicaciones no preguntarán si se quieren guardar las modificaciones
 
 Private Const EWX_FORCE As Long = 4
 
 '
 
 Private Declare Function ExitWindowsEx Lib "user32" (ByVal _
 
 dwOptions As Long, ByVal dwReserved As Long) As Long
 
 
 
 'DECLARACIONES PARA OBTENER EL PERMISO NECESARIO EN NT
 
 Private Type LUID
 
 UsedPart As Long
 
 IgnoredForNowHigh32BitPart As Long
 
 End Type
 
 Private Type TOKEN_PRIVILEGES
 
 PrivilegeCount As Long
 
 TheLuid As LUID
 
 Attributes As Long
 
 End Type
 
 Private Declare Function GetCurrentProcess Lib "kernel32" () As Long
 
 Private Declare Function OpenProcessToken Lib "advapi32" (ByVal _
 
 ProcessHandle As Long, ByVal DesiredAccess As Long, TokenHandle As Long) As Long
 
 Private Declare Function LookupPrivilegeValue Lib "advapi32" _
 
 Alias "LookupPrivilegeValueA" _
 
 (ByVal lpSystemName As String, ByVal lpName As String, lpLuid _
 
 As LUID) As Long
 
 Private Declare Function AdjustTokenPrivileges Lib "advapi32" _
 
 (ByVal TokenHandle As Long, ByVal DisableAllPrivileges As Long, _
 
 NewState As TOKEN_PRIVILEGES, ByVal BufferLength As Long, _
 
 PreviousState As TOKEN_PRIVILEGES, ReturnLength As Long) As Long
 
 Private Sub AdjustToken()
 
 Const TOKEN_ADJUST_PRIVILEGES = &H20
 
 Const TOKEN_QUERY = &H8
 
 Const SE_PRIVILEGE_ENABLED = &H2
 
 Dim hdlProcessHandle As Long
 
 Dim hdlTokenHandle As Long
 
 Dim tmpLuid As LUID
 
 Dim tkp As TOKEN_PRIVILEGES
 
 Dim tkpNewButIgnored As TOKEN_PRIVILEGES
 
 Dim lBufferNeeded As Long
 
 
 
 hdlProcessHandle = GetCurrentProcess()
 
 OpenProcessToken hdlProcessHandle, (TOKEN_ADJUST_PRIVILEGES Or TOKEN_QUERY), hdlTokenHandle
 
 ' Get the LUID for shutdown privilege
 
 LookupPrivilegeValue "", "SeShutdownPrivilege", tmpLuid
 
 tkp.PrivilegeCount = 1 ' One privilege to set
 
 tkp.TheLuid = tmpLuid
 
 tkp.Attributes = SE_PRIVILEGE_ENABLED ' Enable the shutdown privilege in the access token of this process
 
 AdjustTokenPrivileges hdlTokenHandle, False, tkp, Len(tkpNewButIgnored), tkpNewButIgnored, lBufferNeeded
 
 End Sub
 
 
 
 Private Sub btnApagar_Click()
 
 Dim ret As Long, Forzar As Long
 
 
 
 AdjustToken
 
 Forzar = IIf(optForzar.Value, 4, 0)
 
 ret = ExitWindowsEx(cmbTipoApagado.ItemData(cmbTipoApaga  do.ListIndex) + Forzar, 0&)
 
 End Sub
 
 
 
 
 
 Private Sub Form_Load()
 
 cmbTipoApagado.AddItem "LOGOFF"
 
 cmbTipoApagado.ItemData(cmbTipoApagado.NewIndex) = EWX_LOGOFF
 
 cmbTipoApagado.AddItem "SHUTDOWN"
 
 cmbTipoApagado.ItemData(cmbTipoApagado.NewIndex) = EWX_SHUTDOWN
 
 cmbTipoApagado.AddItem "REBOOT"
 
 cmbTipoApagado.ItemData(cmbTipoApagado.NewIndex) = EWX_REBOOT
 
 cmbTipoApagado.ListIndex = 0
 
 End Sub
     |