各位好:  
       我现在想用vb的shell来运行一个外部程序,运行时要用其它权限运行,请问不用runas,还有别的方法吗?runas的运行效率太低,也不好向cmd中输入权限密码。  
       谢谢!

解决方案 »

  1.   

    你可以自己写一个RUNAS程序,想怎么样就怎么样。
    我写过了。
    Option Explicit
    Private Const LOGON_WITH_PROFILE = &H1&
    Private Const CREATE_DEFAULT_ERROR_MODE = &H4000000
    Private Const CREATE_NEW_CONSOLE = &H10&
    Private Const CREATE_NEW_PROCESS_GROUP = &H200&Private Type PROCESS_INFORMATION
    hProcess As Long
    hThread As Long
    dwProcessId As Long
    dwThreadId As Long
    End TypePrivate Type STARTUPINFO
    cb As Long
    lpReserved As Long
    lpDesktop As Long
    lpTitle As Long
    dwX As Long
    dwY As Long
    dwXSize As Long
    dwYSize As Long
    dwXCountChars As Long
    dwYCountChars As Long
    dwFillAttribute As Long
    dwFlags As Long
    wShowWindow As Integer
    cbReserved2 As Integer
    lpReserved2 As Byte
    hStdInput As Long
    hStdOutput As Long
    hStdError As Long
    End Type
    'ʹ´°ÌåʼÖÕ±£³ÖÔÚ×îÇ°Ãæ
    Private Declare Function SetWindowPos Lib "user32" _
             (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, _
              ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
              Const HWND_TOPMOST = -1
    Const SWP_NOMOVE = &H2
    Const SWP_NOSIZE = &H1
    Private Declare Function CreateProcessWithLogon Lib "advapi32" Alias "CreateProcessWithLogonW" (ByVal lpUsername As Long, ByVal lpDomain As Long, ByVal lpPassword As Long, ByVal dwLogonFlags As Long, ByVal lpApplicationName As Long, ByVal lpCommandLine As Long, ByVal dwCreationFlags As Long, ByVal lpEnvironment As Long, ByVal lpCurrentDirectory As Long, lpStartupInfo As STARTUPINFO, lpProcessInfo As PROCESS_INFORMATION) As Long
    Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
    Dim TPath As String
    Dim OkPath As String
    'ÒÔϺ¯ÊýÓÃÖƶ¨ÃûºÍÃÜÂëµ÷ÓÃÁËÓ¦ÓóÌÐò
    Private Function AnShell(Username As String, Domain As String, Password As String, ApplicationName As String) As Long
    Dim lpUsername As String, lpDomain As String, lpPassword As String, lpApplicationName As String, lpCommandLine As String, lpCurrentDirectory As String
    Dim StartInfo As STARTUPINFO, ProcessInfo As PROCESS_INFORMATION
    lpUsername = Username
    lpDomain = Domain
    lpPassword = Password
    lpApplicationName = ApplicationName
    lpCommandLine = vbNullString
    lpCurrentDirectory = vbNullString
    StartInfo.cb = LenB(StartInfo)
    StartInfo.dwFlags = 0&
    CreateProcessWithLogon StrPtr(lpUsername), StrPtr(lpDomain), StrPtr(lpPassword), LOGON_WITH_PROFILE, StrPtr(lpApplicationName), StrPtr(lpCommandLine), CREATE_DEFAULT_ERROR_MODE Or CREATE_NEW_CONSOLE Or CREATE_NEW_PROCESS_GROUP, ByVal 0&, StrPtr(lpCurrentDirectory), StartInfo, ProcessInfo
    CloseHandle ProcessInfo.hThread
    CloseHandle ProcessInfo.hProcess
    AnShell = ProcessInfo.dwProcessId
    End Function
    Private Sub Command1_Click()
    AnShell "chinahcnet.com", "", "chinahcnet.com", OkPath
    End SubPrivate Sub Form_Click()
    'Óøոս¨Á¢µÄ¹ÜÀíÔ±ÔËÐÐÒ»¸ö³ÌÐò,ÕâÀïÊǼÇʱ¾,
    '²ÎÊý1ΪÓû§Ãû,²ÎÊý2ΪÓò(Ò»°ãΪ¿Õ¾Í¿ÉÒÔÁË,ÒòΪÊDZ¾»ú),
    '²ÎÊý3ΪҪÔËÐеijÌÐò·¾¶ºÍÃû×Ö(ÕâÀïµ÷ÓõÄÊÇWINDOWSϵijÌÐò,
    'ËùÒÔWINDOWS»á×Ô¼ºÕÒµ½µÄ,
    '³ÌÐòÔËÐÐʱµÄ¼¸¸öPATHÊÇWINDOWS,SYSTEM,SYSTEM32,APP.PATH,
    'µ±È»¿ÉÒÔͨ¹ýÐÞ¸ÄWINDOWSµÄPATHÀ´¸Ä±ä)
      AnShell "test", "", "test", Trim(OkPath)
     MsgBox OkPath
    End
    End Sub