當前位置:成語大全網 - 漢語詞典 - 如何用VB語言設置壹個簡單的關機程序

如何用VB語言設置壹個簡單的關機程序

如果系統是XP,您可以使用以下語句:

殼牌公司的關閉-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

結束功能