Как использовать CreateProcessWithLogonW с внутренними командами - PullRequest
0 голосов
/ 26 мая 2020

У нас есть приложение VB6, которому иногда требуется запустить команду с повышенными разрешениями, поэтому мы вызываем функцию CreateProcessWithLogonW, чтобы сделать это, не требуя от пользователя ввода учетных данных. В настоящее время мы делаем это с помощью xcopy, и он работает без проблем. Теперь я пытаюсь реализовать функцию удаления, но в коде возврата я получаю 0, LastDLLError = 2 (я считаю, что это означает, что файл не найден). Итак, я думаю, что причина такого поведения связана с тем, что xcopy является внешней командой, а del - внутренней. Есть ли способ использовать del с CreateProcessWithLogonW? Если нет, есть ли какие-либо альтернативы использованию команды del, которые являются просто «встроенными» (т. Е. Без использования пакетного сценария, пользовательской программы, которую я должен где-то хранить, и т. Д. c.)?

Public 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
................
    Dim lngReturnValue As Long
    Dim lngProcessID As Long, lngProcessReturnValue As Long
    Dim StartInfo As STARTUPINFO, ProcessInfo As PROCESS_INFORMATION
    Dim strFullCallCommand As String
    Dim i As Long

    On Error GoTo ErrorHandler

    StartInfo.cb = LenB(StartInfo)
    StartInfo.dwFlags = &H1     'new console window
    StartInfo.wShowWindow = &H0 'hide the new console window

    'Run command
    lngReturnValue = CreateProcessWithLogon(StrPtr(strUserName), StrPtr(strDomain), StrPtr(strPassword), &H2&, StrPtr(vbNullString), StrPtr(strCommand), _
                                            &H4000000 Or &H10& Or &H200&, ByVal 0&, StrPtr(vbNullString), StartInfo, ProcessInfo)

    If lngReturnValue = 0 Then
        RaiseErr errExternalProgram_ProgramErredOut, "CreateProcessWithLogonW function failed." & vbCrLf & _
                                                     "LastDLLError Code: " & Err.LastDllError & vbCrLf & _
                                                     "User: " & strUserName & vbCrLf & _
                                                     "Domain: " & strDomain & vbCrLf & _
                                                     "Password: " & String(10, "*") & vbCrLf & _
                                                     "Command: " & strCommand & vbCrLf & _
                                                     "Actual Call: CreateProcessWithLogon(" & CStr(StrPtr(strUserName)) & ", " & CStr(StrPtr(strDomain)) & ", " & _
                                                                   CStr(StrPtr(strPassword)) & ", " & CStr(&H1&) & ", " & CStr(StrPtr(vbNullString)) & ", " & _
                                                                   CStr(StrPtr(strCommand)) & ", " & CStr(&H4000000) & " Or " & CStr(&H10&) & " Or " & _
                                                                   CStr(&H200&) & ", ByVal " & CStr(0&) & ", " & CStr(StrPtr(vbNullString)) & ", [STARTUPINFO Type], [PROCESS_INFORMATION Type])"
    End If

Заранее спасибо!

1 Ответ

2 голосов
/ 26 мая 2020
cmd /c del <filename>

cmd.exe - это приложение для запуска.

/c переключатель запускает команду и завершает работу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...