殼牌公司的關閉-r -t。text 1 . text ' & amp;"-c " & amp;文本2 .文本
Text1.text是以秒為單位設置的關機時間,text2.text是關機提示。如果不想關機,運行“shutdown -a”即可。
如果您的倒計時間隔是固定的(例如,30秒),您可以使用以下選項:
殼牌“關閉-r -t 30”
如果妳說的是其他系統,這裏有壹個模塊。妳自己說吧。
私有類型OSVERSIONINFO
dwOSVersionInfoSize As Long
dwMajorVersion壹樣長
dwMinorVersion壹樣長
dwBuildNumber為Long
dwPlatformId壹樣長
szCSDVersion As String * 128 ' PSS使用的維護字符串
結束類型
私有聲明函數GetVersionEx Lib "kernel32 "別名" GetVersionExA "(lpVersionInformation As OS versioninfo)為Long
私有常量VER _平臺_WIN32_NT = 2
私有常量VER _平臺_WIN32_WINDOWS = 1
私有常量VER _平臺_WIN32s = 0
報告API錯誤:
私有常量格式_消息_分配_緩沖區= & ampH100
私有常量FORMAT _ MESSAGE _ ARGUMENT _ ARRAY = & amp;H2000
private Const FORMAT _ MESSAGE _ FROM _ hm odule = & amp;H800
私有常量FORMAT _ MESSAGE _ FROM _ STRING = & amp;H400
私有常量格式消息系統= & ampH1000
私有常量FORMAT _ MESSAGE _ IGNORE _ INSERTS = & amp;H200
私有常量FORMAT _ MESSAGE _ MAX _ WIDTH _ MASK = & amp;HFF
私有聲明函數FormatMessage Lib "kernel32 "別名" FormatMessageA" (ByVal dwFlags為Long,lpSource為Any,ByVal dwMessageId為Long,ByVal dwLanguageId為Long,ByVal lpBuffer為String,ByVal nSize為Long,Arguments為Long)Long
' =====================================================================
僅NT
私有類型LARGE _整數
下部壹樣長
高部分壹樣長
結束類型
私人型LUID
下部壹樣長
高部分壹樣長
結束類型
私有類型LUID _和_屬性
pLuid為Luid
屬性為長型
結束類型
私有類型令牌_特權
特權計數壹樣長
作為LUID屬性的權限(0到0)
結束類型
私有聲明函數GetCurrentProcess Lib "kernel32 "()為Long
私有聲明函數OpenProcessToken Lib " advapi 32 . dll "(ByVal process handle為Long,ByVal DesiredAccess為Long,TokenHandle為Long)為Long
私有聲明函數CloseHandle Lib " kernel 32 "(ByVal hObject As Long)
私有聲明函數GetTokenInformation Lib " advapi 32 . dll "(ByVal token handle為Long,TokenInformationClass為Integer,TokenInformation為Any,ByVal TokenInformationLength為Long,ReturnLength為Long)
私有聲明函數AdjustTokenPrivileges Lib " advapi 32 . dll "(ByVal TOKEN handle為Long,ByVal DisableAllPrivileges為Long,NewState為TOKEN_PRIVILEGES,ByVal BufferLength為Long,PreviousState為TOKEN_PRIVILEGES,ReturnLength為Long)
私有聲明函數LookupPrivilegeValue Lib " advapi 32 . dll "別名" LookupPrivilegeValueA "(ByVal LP system name為字符串,ByVal lpName為字符串,lpLuid為Luid)長
私有Const SE _ shut down _ NAME = " seshutdown privilege "
私有常量SE _ PRIVILEGE _ ENABLED = & amp氘
私有常量READ _ CONTROL = & ampH20000
私人Const標準_權利_所有= & ampH1F0000
私有常量標準_權限_執行=(讀取_控制)
私有常量標準_權限_讀取=(讀取_控制)
私有Const標準_權利_要求= & ampHF0000
私有常量標準權限寫=(讀控制)
私有常量TOKEN _ ASSIGN _ PRIMARY = & ampH1
私有常量TOKEN _ DUPLICATE =(& amp;H2)
私有常量TOKEN _ IMPERSONATE =(& amp;H4)
私有常量TOKEN _ QUERY =(& amp;H8)
私有常量TOKEN _ QUERY _ SOURCE =(& amp;H10)
私有常量TOKEN _ ADJUST _ PRIVILEGES =(& amp;H20)
私有常量TOKEN _ ADJUST _ GROUPS =(& amp;H40)
私有常量TOKEN _ ADJUST _ DEFAULT =(& amp;H80)
私有常量令牌_全部_訪問=(標準_權限_必需或_
令牌_分配_主要或_
令牌_重復或_
令牌_模擬或_
TOKEN_QUERY或_
TOKEN_QUERY_SOURCE或_
令牌_調整_權限或_
令牌_調整_組或_
令牌_調整_默認)
私有常量TOKEN_READ =(標準權限讀取或令牌查詢)
私有常量TOKEN_WRITE =(標準權限寫入或_
令牌_調整_權限或_
令牌_調整_組或_
令牌_調整_默認)
私有常量令牌執行=(標準權限執行)
私有常量TokenDefaultDacl = 6
私有常量令牌組= 2
私有常量TokenImpersonationLevel = 9
私有常量TokenOwner = 4
私有常量TokenPrimaryGroup = 5
私有常量令牌特權= 3
私有常量令牌源= 7
私有常量TokenStatistics = 10
私有常量TokenType = 8
私有常量令牌用戶= 1
私有聲明函數InitiateSystemShutdown Lib " advapi 32 . dll " Alias " InitiateSystemShutdownA "(ByVal lpMachineName為字符串,ByVal lpMessage為字符串,ByVal dwTimeout為長整型,ByVal bForceAppsClosed為長整型,ByVal bRebootAfterShutdown為長整型)
私有聲明函數AbortSystemShutdown Lib " advapi 32 . dll "別名" AbortSystemShutdownA "(ByVal lpMachineName As String)為Long
' ================================================================
字符串形式的公共函數WinError(ByVal lLastDLLError)
Dim sBuff作為字符串
Dim lCount As Long
返回與LastDLLError關聯的錯誤信息:
sBuff = String$(256,0)
lCount = FORMAT MESSAGE(FORMAT _ MESSAGE _ FROM _ SYSTEM或FORMAT_MESSAGE_IGNORE_INSERTS,_
lLastDLLError,0 & amp,sBuff,Len(sBuff),ByVal 0)
如果lCount那麽
WinError = Left$(sBuff,lCount)
如果…就會結束
結束功能
公共函數not()為布爾值
布爾型靜態bOnce
靜態值為布爾值
返回系統是否是NT:
如果沒有,那麽
Dim tVI As OSVERSIONINFO
tVI . dwosversioninfosize = Len(tVI)
if(GetVersionEx(tVI)& lt;& gt0)然後
b value =(tvi . dwplatformid = VER _平臺_WIN32_NT)
bOnce = True
如果…就會結束
如果…就會結束
不是= b值
結束功能
私有函數ntenableshut down(ByRef sMsg As String)為布爾值
像LUID壹樣模糊
Dim hProcess壹樣長
Dim hToken壹樣長
Dim tTP As TOKEN_PRIVILEGES,tTPOld As TOKEN_PRIVILEGES
Dim lTpOld As Long
Dim lR壹樣長
在NT下,我們必須給試圖關閉系統的進程SE_SHUTDOWN_NAME特權。
否則,所有關閉系統的嘗試都將無效!
LUID尋找壽降特權令牌:
lR = LookupPrivilegeValue(vbNullString,SE_SHUTDOWN_NAME,tLUID)
如果我們找到了,
if(lR & lt;& gt0)然後
獲取當前進程的句柄:
hProcess = GetCurrentProcess()
if(h process & lt;& gt0)然後
打開令牌進行調整和查詢(用戶可能沒有權限)
lR = OpenProcessToken(hProcess,TOKEN_ADJUST_PRIVILEGES或TOKEN_QUERY,hToken)
if(lR & lt;& gt0)然後
好了,現在我們可以調整關機權限了:
使用tTP
。PrivilegeCount = 1
與。權限(0)
。屬性= SE _權限_已啟用
. pLuid.HighPart = tLUID。高部件
. pLuid.LowPart = tLUID。低部
以…結尾
以…結尾
允許此過程立即關閉系統:
lR = AdjustTokenPrivileges(hToken,0,tTP,Len(tTP),tTPOld,lTpOld)
if(lR & lt;& gt0)然後
NTEnableShutDown = True
其他
呃。提高eeSSDErrorBase + 6,App。EXEName & amp".mShutDown ","無法關閉:您沒有權限關閉此系統。[" & amp;WinError(錯誤。LastDllError)& amp;"]"
如果…就會結束
使用後記得關閉該手柄:
CloseHandle hToken
其他
呃。提高eeSSDErrorBase + 6,App。EXEName & amp".mShutDown ","無法關閉:您沒有權限關閉此系統。[" & amp;WinError(錯誤。LastDllError)& amp;"]"
如果…就會結束
其他
呃。提高eeSSDErrorBase + 5,App。EXEName & amp".無法關閉:無法終止當前進程。[" & amp;WinError(錯誤。LastDllError)& amp;"]"
如果…就會結束
其他
呃。提高eeSSDErrorBase + 4,App。EXEName & amp".無法關閉:找不到SE_SHUTDOWN_NAME權限值。[" & amp;WinError(錯誤。LastDllError)& amp;"]"
如果…就會結束
結束功能
公共函數NTForceTimedShutdown( _
可選ByVal lTimeOut As Long = -1,_
可選的ByVal sMsg As String = " ",_
可選ByVal sMachineNetworkName As String = vbNullString,_
可選ByVal bForceAppsToClose As Boolean = False,_
可選ByVal bReboot As Boolean = False _
)作為布爾值
Dim lR壹樣長
如果不是,那麽
如果我們在NT下,我們確定我們已經給了這個進程關閉系統的特權:
如果不是(NTEnableShutDown(sMsg)),則
退出功能
如果…就會結束
這是定期關閉系統的代碼:
lR = initiatesystemshut down(sMachineNetworkName,sMsg,lTimeOut,bForceAppsToClose,bReboot)
如果(lR = 0)則
呃。提高eeSSDErrorBase + 2,App。EXEName & amp".mShutDown "," InitiateSystemShutdown失敗:" & ampWinError(錯誤。LastDllError)
如果…就會結束
其他
呃。提高eeSSDErrorBase + 1,App。EXEName & amp".mShutDown”,“函數只在Windows NT下有效。”
如果…就會結束
結束功能
公共函數NTAbortTimedShutdown(可選ByVal sMachineNetworkName As String = vbNullString)
abortsystemshut down sMachineNetworkName
結束功能