我知道这是一个很老的问题,但我需要找到答案,我想我可以帮助其他的搜索。我写了一个小函数来在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的原因。我提到了清单,因为这是通常的做法。 –