我知道這是一個很老的問題,但我需要找到答案,我想我可以幫助其他的搜索。我寫了一個小函數來在VBScript中執行這個任務(粘貼在下面)。它很容易適應VB.net/VB6。
函數返回碼:
0 - 成功,更改了快捷方式。
99 - 快捷標誌已設置爲以管理員身份運行。
114017 - 文件未找到
114038 - 數據文件格式無效(特別是該文件太小)
所有其他非零=意外錯誤。
正如Chada在後面的文章中所提到的,這個腳本不適用於msi Advertised快捷方式。如果您使用此方法來操作快捷方式中的位,它必須是標準的,未公佈的快捷方式。
參考文獻: MS快捷方式LNK格式:http://msdn.microsoft.com/en-us/library/dd871305
一些啓示:Read and write binary file in VBscript
請注意,該功能不檢查一個有效的LNK快捷方式。事實上,你可以給它提供任何文件,它會改變文件中的十六進制字節15h,將第32位設置爲打開。
如果在修改之前將原始快捷方式複製到%TEMP%。
Daz。
'# D.Collins - 12:58 03/09/2012
'# Sets a shortcut to have the RunAs flag set. Drag an LNK file onto this script to test
Option Explicit
Dim oArgs, ret
Set oArgs = WScript.Arguments
If oArgs.Count > 0 Then
ret = fSetRunAsOnLNK(oArgs(0))
MsgBox "Done, return = " & ret
Else
MsgBox "No Args"
End If
Function fSetRunAsOnLNK(sInputLNK)
Dim fso, wshShell, oFile, iSize, aInput(), ts, i
Set fso = CreateObject("Scripting.FileSystemObject")
Set wshShell = CreateObject("WScript.Shell")
If Not fso.FileExists(sInputLNK) Then fSetRunAsOnLNK = 114017 : Exit Function
Set oFile = fso.GetFile(sInputLNK)
iSize = oFile.Size
ReDim aInput(iSize)
Set ts = oFile.OpenAsTextStream()
i = 0
Do While Not ts.AtEndOfStream
aInput(i) = ts.Read(1)
i = i + 1
Loop
ts.Close
If UBound(aInput) < 50 Then fSetRunAsOnLNK = 114038 : Exit Function
If (Asc(aInput(21)) And 32) = 0 Then
aInput(21) = Chr(Asc(aInput(21)) + 32)
Else
fSetRunAsOnLNK = 99 : Exit Function
End If
fso.CopyFile sInputLNK, wshShell.ExpandEnvironmentStrings("%temp%\" & oFile.Name & "." & Hour(Now()) & "-" & Minute(Now()) & "-" & Second(Now()))
On Error Resume Next
Set ts = fso.CreateTextFile(sInputLNK, True)
If Err.Number <> 0 Then fSetRunAsOnLNK = Err.number : Exit Function
ts.Write(Join(aInput, ""))
If Err.Number <> 0 Then fSetRunAsOnLNK = Err.number : Exit Function
ts.Close
fSetRunAsOnLNK = 0
End Function
來源
2012-09-03 12:19:06
Daz
我需要用戶提示輸入憑據。這可能與runas? – bernhof
由於它對於管理員和普通用戶來說都是完全有效的,所以我不認爲這個清單不能幫助我。除非我錯過了什麼? – bernhof
Runas專門用於提示憑據。清單在你的場景中幫助不大,這就是我爲什麼推薦ShellExecute的原因。我提到了清單,因爲這是通常的做法。 –