13 respuestas
Hola,
Yo mismo soy principiante en VBS, pero la respuesta estaba en el script...
Solicita el nombre del ordenador, solo hay que cancelar la solicitud haciendo "." :
Yo mismo soy principiante en VBS, pero la respuesta estaba en el script...
Solicita el nombre del ordenador, solo hay que cancelar la solicitud haciendo "." :
Dim objShell, strComputer, strInput Dim strShutdown Do strComputer = "." If strComputer <> "" Then strInput = True End if Loop until strInput = True strShutdown = "shutdown -s -t 0 -f -m \\" & strComputer set objShell = CreateObject("WScript.Shell") objShell.Run strShutdown Wscript.Quit
he encontrado esto
Si su aplicación debe disponer de un privilegio, para ciertas acciones (como por ejemplo solicitar el apagado de la máquina), podrá utilizar la función a continuación. Tenga en cuenta que se aconseja retirar siempre un privilegio una vez realizada la acción.
La siguiente función otorga o retira (según el valor del parámetro grant) el privilegio dado en el parámetro name:
bool __fastcall SetPrivilege(AnsiString name, bool grant)
{
TOKEN_PRIVILEGES wTokenIn, wTokenOut;
DWORD wLength;
HANDLE wCurrentProcess, wToken;
_LUID wLuid;
bool ret;
wCurrentProcess = GetCurrentProcess();
OpenProcessToken(wCurrentProcess, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &wToken);
LookupPrivilegeValue(NULL, name.c_str(), &wLuid);
wTokenIn.PrivilegeCount = 1;
wTokenIn.Privileges[0].Luid = wLuid;
wTokenIn.Privileges[0].Attributes = (grant?SE_PRIVILEGE_ENABLED:0);
ret = AdjustTokenPrivileges(wToken, FALSE, &wTokenIn, sizeof(TOKEN_PRIVILEGES), &wTokenOut,&wLength);
CloseHandle(wToken);
return ret;
}
Por ejemplo, para agregar el parámetro SE_SHUTDOWN_NAME, realizar una acción y retirar el privilegio, basándonos en la información del MSDN que lista las constantes de autorización (ver más abajo), utilizaremos:
SetPrivilege("SeShutdownPrivilege",true);
// acciones
SetPrivilege("SeShutdownPrivilege",false);
Si su aplicación debe disponer de un privilegio, para ciertas acciones (como por ejemplo solicitar el apagado de la máquina), podrá utilizar la función a continuación. Tenga en cuenta que se aconseja retirar siempre un privilegio una vez realizada la acción.
La siguiente función otorga o retira (según el valor del parámetro grant) el privilegio dado en el parámetro name:
bool __fastcall SetPrivilege(AnsiString name, bool grant)
{
TOKEN_PRIVILEGES wTokenIn, wTokenOut;
DWORD wLength;
HANDLE wCurrentProcess, wToken;
_LUID wLuid;
bool ret;
wCurrentProcess = GetCurrentProcess();
OpenProcessToken(wCurrentProcess, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &wToken);
LookupPrivilegeValue(NULL, name.c_str(), &wLuid);
wTokenIn.PrivilegeCount = 1;
wTokenIn.Privileges[0].Luid = wLuid;
wTokenIn.Privileges[0].Attributes = (grant?SE_PRIVILEGE_ENABLED:0);
ret = AdjustTokenPrivileges(wToken, FALSE, &wTokenIn, sizeof(TOKEN_PRIVILEGES), &wTokenOut,&wLength);
CloseHandle(wToken);
return ret;
}
Por ejemplo, para agregar el parámetro SE_SHUTDOWN_NAME, realizar una acción y retirar el privilegio, basándonos en la información del MSDN que lista las constantes de autorización (ver más abajo), utilizaremos:
SetPrivilege("SeShutdownPrivilege",true);
// acciones
SetPrivilege("SeShutdownPrivilege",false);
Tu código no funciona. Evidentemente, porque es C... así que con VBSscript....
He encontrado cómo cambiar el nivel de privilegios. Se realiza en la conexión a la WMI.
Por lo tanto, hay que modificar el código que te di de la siguiente manera:
On Error Resume Next
strComputer = "."
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate,(Shutdown)}\\" & strComputer & "\root\cimv2")
if Err.Number <> 0 Then
Wscript.Echo "Error al conectarse a " & strComputer & " : " & Err.Description
Err.Clear
wscript.quit
end if
Set oWindows = objWMIService.ExecQuery("Select Name From Win32_OperatingSystem")
if Err.Number <> 0 Then
Wscript.Echo "Error en la consulta a " & strComputer & " : " & Err.Description
Err.Clear
wscript.quit
end if
For Each oSys In oWindows
oSys.Win32ShutDown(5)
if Err.Number <> 0 Then
Wscript.Echo "Error al detener el sistema " & strComputer & " : " & Err.Description
Err.Clear
wscript.quit
end if
Next
wscript.quit
Así, funciona a la perfección.
Buena suerte.
He encontrado cómo cambiar el nivel de privilegios. Se realiza en la conexión a la WMI.
Por lo tanto, hay que modificar el código que te di de la siguiente manera:
On Error Resume Next
strComputer = "."
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate,(Shutdown)}\\" & strComputer & "\root\cimv2")
if Err.Number <> 0 Then
Wscript.Echo "Error al conectarse a " & strComputer & " : " & Err.Description
Err.Clear
wscript.quit
end if
Set oWindows = objWMIService.ExecQuery("Select Name From Win32_OperatingSystem")
if Err.Number <> 0 Then
Wscript.Echo "Error en la consulta a " & strComputer & " : " & Err.Description
Err.Clear
wscript.quit
end if
For Each oSys In oWindows
oSys.Win32ShutDown(5)
if Err.Number <> 0 Then
Wscript.Echo "Error al detener el sistema " & strComputer & " : " & Err.Description
Err.Clear
wscript.quit
end if
Next
wscript.quit
Así, funciona a la perfección.
Buena suerte.
He encontrado un código que permite activar .bat
pero estoy luchando para crearlo, tengo el código pero no consigo crearlo con shutdown -s dentro
CreateObject(servername.typename [, location])
si alguien pudiera ayudarme, gracias.
pero estoy luchando para crearlo, tengo el código pero no consigo crearlo con shutdown -s dentro
CreateObject(servername.typename [, location])
si alguien pudiera ayudarme, gracias.
Te propongo el siguiente código, pasando por la WMI.
Sin embargo, lo fabriqué a partir de 2 códigos que tenía (que funcionaban por separado) y no estoy seguro de que el pegado final funcione...
On Error Resume Next
strComputer = "."
'conexión a la WMI local
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
' consulta sobre los objetos
Set oWindows = objWMIService.ExecQuery("Select Name From Win32_OperatingSystem")
For Each oSys In oWindows
oSys.Win32ShutDown(5)
Wscript.Echo "Apagando el sistema en curso: " & pComputer
Next
wscript.quit
Sin embargo, lo fabriqué a partir de 2 códigos que tenía (que funcionaban por separado) y no estoy seguro de que el pegado final funcione...
On Error Resume Next
strComputer = "."
'conexión a la WMI local
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
' consulta sobre los objetos
Set oWindows = objWMIService.ExecQuery("Select Name From Win32_OperatingSystem")
For Each oSys In oWindows
oSys.Win32ShutDown(5)
Wscript.Echo "Apagando el sistema en curso: " & pComputer
Next
wscript.quit
gracias por el código, hay una ventana que aparece "detención del sistema en curso" pero no se apaga, sin embargo, cuando se lanza un apagado sin tiempo definido, se apaga después de 30 segundos, pero en este caso no, ¿puedes probarlo?
gracias
gracias
No, eso no es.
si reemplazamos
oSys.Win32ShutDown(5) por oSys.Win32ShutDown(4) que permite cerrar la sesión, funciona.
Cuando muestro el error, obtengo un mensaje "privilegio no mantenido"
Pero estoy en vista....
¿Puedes modificar el script de la siguiente manera?:
On Error Resume Next
strComputer = "."
'conexión a la WMI local
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
' consulta sobre los objetos
Set oWindows = objWMIService.ExecQuery("Select Name From Win32_OperatingSystem")
For Each oSys In oWindows
oSys.Win32ShutDown(5)
if Err.Number <> 0 Then
Wscript.Echo "Error al apagar: " & strComputer & " : " & Err.Description
Err.Clear
wscript.quit
end if
Next
wscript.quit
¿Y ver el mensaje que te muestra???
si reemplazamos
oSys.Win32ShutDown(5) por oSys.Win32ShutDown(4) que permite cerrar la sesión, funciona.
Cuando muestro el error, obtengo un mensaje "privilegio no mantenido"
Pero estoy en vista....
¿Puedes modificar el script de la siguiente manera?:
On Error Resume Next
strComputer = "."
'conexión a la WMI local
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
' consulta sobre los objetos
Set oWindows = objWMIService.ExecQuery("Select Name From Win32_OperatingSystem")
For Each oSys In oWindows
oSys.Win32ShutDown(5)
if Err.Number <> 0 Then
Wscript.Echo "Error al apagar: " & strComputer & " : " & Err.Description
Err.Clear
wscript.quit
end if
Next
wscript.quit
¿Y ver el mensaje que te muestra???