Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.12.2008, 10:50   #1
Андреy
 
Регистрация: 27.11.2007
Сообщений: 7
По умолчанию Запуск процесса под другим пользователем

Всем добрый день.
Никак не получается открыть файл под другим пользователем.
GetLastError возвращает код 1326 — unknown user name or bad password.
Но имя пользователя и пароль ВЕРНЫ!
Потому что вот такой код работает:
Код:
Dim SInfo As STARTUPINFOW
Dim PInfo As PROCESS_INFORMATION

SInfo.cb = Len(SInfo)
SInfo.lpReserved = 0
SInfo.dwFlags = 0
SInfo.wShowWindow = WindowStyle
    
    If Directory = "" Then
        sDir = CurDir
    Else
        sDir = Directory
    End If
        
Res = CreateProcessWithLogonW(sUsername, sDomain, sPwd, _
                              LOGON_NETCREDENTIALS_ONLY, _
                              "C:\Program Files\Microsoft Office\OFFICE11\excel.exe", _
                              "/r " & Chr(34) & fName & Chr(34) & "", _
                              0&, _
                              ByVal 0&, _
                              StrPtr(sDir), _
                              SInfo, PInfo)
Код выше запускает Excel, но файл открыть не может (пользователь, под которым запущен комп, не имеет к нему доступа, а пользователь sUsername — имеет, поэтому под ним Excel и запускается.)
Далее. Вообще нужно использовать параметр LOGON_WITH_PROFILE. Код ниже не работает, и ошибка 1326:
Код:
Dim SInfo As STARTUPINFOW
Dim PInfo As PROCESS_INFORMATION

SInfo.cb = Len(SInfo)
SInfo.lpReserved = 0
SInfo.dwFlags = 0
SInfo.wShowWindow = WindowStyle
    
    If Directory = "" Then
        sDir = CurDir
    Else
        sDir = Directory
    End If
        
Res = CreateProcessWithLogonW(sUsername, sDomain, sPwd, _
                              LOGON_WITH_PROFILE, _
                              "C:\Program Files\Microsoft Office\OFFICE11\excel.exe", _
                              "/r " & Chr(34) & fName & Chr(34) & "", _
                              0&, _
                              ByVal 0&, _
                              StrPtr(sDir), _
                              SInfo, PInfo)
Пробую сделать просто вход (LogonUser) — и тоже ошибка 1326.
Код:
r = LogonUser(sUsername, sDomain, sPwd, _
              LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, Token)
При этом эксперементировал с параметрами dwLogonType и dwLogonProvider — иногда код ошибки меняется.
LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT — код 1326
LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_WINNT50 — код 1326
LOGON32_LOGON_BATCH, LOGON32_PROVIDER_DEFAULT — код 1909 (the referenced account is currently locked out and may not be logged on to)
LOGON32_LOGON_BATCH, LOGON32_PROVIDER_WINNT50 — код 1326
LOGON32_LOGON_NETWORK, LOGON32_PROVIDER_DEFAULT — код 1326
LOGON32_LOGON_NETWORK , LOGON32_PROVIDER_WINNT50 — код 1909

В чем может быть причина? Пароль и пользователь верны. Работаю под XP — значит жесткое условие на функцию LogonUser отпадает (я про супер-пупер права учетки).
Андреy вне форума Ответить с цитированием
Старый 03.12.2008, 08:16   #2
Д'якон
Форумчанин
 
Регистрация: 05.12.2007
Сообщений: 236
По умолчанию

попробуй сначала зарегить пользователя. LogonUser
А вообще выложи весь код со значениями переменных
Д'якон вне форума Ответить с цитированием
Старый 03.12.2008, 17:54   #3
Андреy
 
Регистрация: 27.11.2007
Сообщений: 7
По умолчанию

Цитата:
А вообще выложи весь код со значениями переменных
Выкладываю код. Бью на 2 сообщения - в одном не умещается, форум ругается.
Здесь будет пример с использованием CreateProcessWithLogonW
1 часть. Модуль, где пробую через CreateProcessWithLogonW
2 ч. Вызов функций из модуля по нажатию кнопки
Итак:
п.1
Код:
Public Function RunAs(sUser As String, sPwd As String, _
    sCmdLine As String, Optional Parameters As String = "", _
    Optional Directory As String = "", _
    Optional WindowStyle As VbAppWinStyle = vbNormalFocus, _
    Optional hProcess As Long, Optional ProcID As Long) As Long
    
    Dim SInfo As STARTUPINFOW
    Dim PInfo As PROCESS_INFORMATION
    Dim aUser() As String
    Dim sDomain As String
    Dim sUsername As String
    Dim sDir As String
    Dim sCmd As String
    Dim Res As Long
    
    aUser = Split(sUser, "\")
    If UBound(aUser) = 1 Then
        sDomain = aUser(0)
        sUsername = aUser(1)
    Else
        sDomain = ComputerName
        sUsername = sUser
    End If

    SInfo.cb = Len(SInfo)
    SInfo.dwFlags = 0
    SInfo.wShowWindow = WindowStyle
    
    If Directory = "" Then
        sDir = CurDir
    Else
        sDir = Directory
    End If
    
    If Parameters <> "" Then
        sCmd = sCmdLine & " " & Parameters
    Else
        sCmd = sCmdLine
    End If
    
    ' ниже использ-ся LOGON_NETCREDENTIALS_ONLY
    '  при этом файл открыть не удается, лишь запускается приложение
    ' когда LOGON_WITH_PROFILE - ошибка 1326 (unknown user or bad pswd)
    Res = CreateProcessWithLogonW(StrPtr(sUsername), StrPtr(sDomain), StrPtr(sPwd), _
                                  LOGON_NETCREDENTIALS_ONLY, _
                                  0&, StrPtr(sCmd), _
                                  0&, _
                                  ByVal 0&, _
                                  StrPtr(sDir), _
                                  SInfo, PInfo)
    
    If Res <> 0 Then
        hProcess = PInfo.hProcess
        ProcID = PInfo.dwProcessId        
    Else
        RunAs = Err.LastDllError        
        hProcess = 0
        ProcID = 0
    End If    
End Function

' Вот несколько иной вариант процедуры
' Позволяет отдельно задать AppName и CmdLine
Public Function MyRunAs(sUser As String, sPwd As String, _
    sAppName As String, sCmdLine As String, _
    Optional Directory As String = "", _
    Optional WindowStyle As VbAppWinStyle = vbNormalFocus) As Long    
    Dim SInfo As STARTUPINFOW
    Dim PInfo As PROCESS_INFORMATION
    Dim aUser() As String, sDomain As String, sUsername As String    
    Dim Res As Long
    
    aUser = Split(sUser, "\")
    If UBound(aUser) = 1 Then
        sDomain = aUser(0)
        sUsername = aUser(1)
    Else
        sDomain = ComputerName
        sUsername = sUser
    End If
    
    SInfo.cb = Len(SInfo)
    SInfo.lpReserved = 0
    SInfo.dwFlags = 0
    SInfo.wShowWindow = WindowStyle
    
    If Directory = "" Then
        sDir = CurDir
    Else
        sDir = Directory
    End If
    
    ' насчет рез-тов использования параметров LOGON_WITH_PROFILE и
    '  LOGON_NETCREDENTIALS_ONLY см. комментарий в прошлой ф-ции    
    Res = CreateProcessWithLogonW(StrPtr(sUsername), StrPtr(sDomain), StrPtr(sPwd), _
                                  LOGON_WITH_PROFILE, _
                                  StrPtr(sAppName), StrPtr(sCmdLine), _
                                  0&, _
                                  ByVal 0&, _
                                  StrPtr(sDir), _
                                  SInfo, PInfo)
    
    If Res <> 0 Then       
    Else
        MyRunAs = Err.LastDllError        
    End If   
End Function
п.3. Использование ф-ций из модуля
Код:
Private Sub CommandButton1_Click()           
    Dim fName As String    
    fName = "N:\SecretData\Priselist2008.xls"        

'    rtrn = RunAs("SuperUser", "SecretPswd", "C:\Program Files\Microsoft Office\OFFICE11\excel.exe " & _
'                 Chr(34) & fName & Chr(34) & "", _
'                 "", , vbNormalFocus, _
'                 False, True)

     rtrn = MyRunAs("SuperUser", "SecretPswd", "C:\Program Files\Microsoft Office\OFFICE11\excel.exe", "/r " & Chr(34) & fName & Chr(34) & "", _
                    "", vbNormalFocus)

' Внимание! А вот так запускает - голый Excel)))))
'     Dim ProcID As Long
'     rtrn = RunAs("SuperUser", "SecretPswd", "excel.exe", _
'                 "", , vbNormalFocus, _
'                 , , , ProcID)
End Sub
Андреy вне форума Ответить с цитированием
Старый 03.12.2008, 17:57   #4
Андреy
 
Регистрация: 27.11.2007
Сообщений: 7
По умолчанию Добавление к предыдущему

А вот использование LogonUser
Модуль:
[CODE]
Код:
Public Function ExRunAs(sUser As String, sPwd As String) As Long
  Dim r As Long
  Dim aUser() As String
  Dim sDomain As String
  Dim sUsername As String
  Dim Token As Long
  
  aUser = Split(sUser, "\")
    If UBound(aUser) = 1 Then
        sDomain = aUser(0)
        sUsername = aUser(1)
    Else
        sDomain = ComputerName
        sUsername = sUser
    End If

' Ниже все варианты сочетания параметров - все они испробованы    
'LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT
'  r = LogonUser(sUsername, sDomain, sPwd, _
'                LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, Token)

'LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_WINNT50
'r = LogonUser(sUsername, sDomain, sPwd, _
'                LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_WINNT50, Token)

'LOGON32_LOGON_BATCH, LOGON32_PROVIDER_DEFAULT
'r = LogonUser(sUsername, sDomain, sPwd, _
'                LOGON32_LOGON_BATCH, LOGON32_PROVIDER_DEFAULT, Token)

'LOGON32_LOGON_BATCH, LOGON32_PROVIDER_WINNT50
'  r = LogonUser(sUsername, sDomain, sPwd, _
'                LOGON32_LOGON_BATCH, LOGON32_PROVIDER_WINNT50, Token)
                
'LOGON32_LOGON_NETWORK, LOGON32_PROVIDER_DEFAULT
'r = LogonUser(sUsername, sDomain, sPwd, _
'              LOGON32_LOGON_NETWORK, LOGON32_PROVIDER_DEFAULT, Token)

'LOGON32_LOGON_NETWORK , LOGON32_PROVIDER_WINNT50
r = LogonUser(sUsername, sDomain, sPwd, _
              LOGON32_LOGON_NETWORK, LOGON32_PROVIDER_WINNT50, Token)
              
  If r = 0 Then
    Dim ErrCode As Long
    ErrCode = Err.LastDllError
    MsgBox GetErrorMessage(ErrCode)
  Else
    CloseHandle (Token)
  End If
  ExRunAs = r
и вызов:
Код:
Private Sub CommandButton2_Click()
  r = ExRunAs("PLaccess", "@ccess2Pl")
End Sub
На всякий случай, объявления WinApi
Код:
Public Const LOGON_WITH_PROFILE As Long = &H1&
Public Const LOGON_NETCREDENTIALS_ONLY As Long = &H2&

Public Const LOGON32_LOGON_INTERACTIVE = 2
Public Const LOGON32_LOGON_NETWORK = 3
Public Const LOGON32_LOGON_BATCH = 4

Public Const LOGON32_PROVIDER_DEFAULT = 0
Public Const LOGON32_PROVIDER_WINNT35 = 1
Public Const LOGON32_PROVIDER_WINNT40 = 2
Public Const LOGON32_PROVIDER_WINNT50 = 3
Public Declare Function LogonUser Lib "advapi32" Alias "LogonUserA" ( _
    ByVal lpUsername As String, ByVal lpDomain As String, ByVal lpPassword As String, _
    ByVal dwLogonType As Long, ByVal dwLogonProvider As Long, _
    phToken As Long) As Long
    
Public Declare Function CreateProcessWithLogonW Lib "advapi32" ( _
    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, lpEnvironment As Any, _
    ByVal lpCurrentDirectory As Long, lpStartupInfo As STARTUPINFOW, _
    lpProcessInfo As PROCESS_INFORMATION) As Long
    
Public Declare Function CloseHandle Lib "kernel32.dll" (ByVal hObj As Long) As Long
    
Public Declare Function SHCreateProcessAsUserW Lib "Shell32" ( _
    pscpi As SHCREATEPROCESSINFOW) As Long
Андреy вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Запуск своего приложения одновременно с другим Sauronb|4 Общие вопросы Delphi 1 19.10.2008 18:45
Как скопировать проект под другим именем? Dimoney Свободное общение 4 17.12.2007 13:50
Вход под одним пользователем Mihael Безопасность, Шифрование 3 21.11.2007 12:14
Запуск процесса на время zetrix Win Api 1 19.11.2007 16:49
Запуск процесса написанного на Java из Delphi basil Общие вопросы по Java, Java SE, Kotlin 0 21.06.2007 16:19