Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2003.03.24;
Скачать: [xml.tar.bz2];

Вниз

runas.exe - ОШИБКА!   Найти похожие ветки 

 
Василий2   (2002-12-13 11:49) [0]

Это программа - аналог "runas.exe" из Виндовс, только пароль можно задать как параметр. Вот листинг программы, только где-то вылезает ошибка. Помогите найти ее, пожалуйста.

program runas;
{$APPTYPE CONSOLE}

uses Windows;
{$INCLUDE convert.pas}

const
ADVAPI32 = "advapi32.dll";
LOGON_WITH_PROFILE = 1;
LOGON_NETCREDENTIALS_ONLY = 2;

var
hAdvAPI32 : THandle;
CreateProcessWithLogonW : function(lpUsername : LPCWSTR;
lpDomain : LPCWSTR;
lpPassword : LPCWSTR;
dwLogonFlags : DWORD;
lpApplicationName : LPCWSTR;
lpCommandLine : LPWSTR;
dwCreationFlags : DWORD;
lpEnvironment : POINTER;
lpCurrentDirectory : LPCWSTR;
lpStartupInfo : TStartupInfo;
lpProcessInfo : TProcessInformation) : bool; stdcall;

StartupInfo: TStartupInfo;
ProcessInfo: TProcessInformation;

Username : string;
Password : string;
CmdLine : string;
Dir : array[0..MAX_PATH-1] of char;

procedure usage(cmd : string);
begin
writeln(formatx("Usage: %s username password cmd [arguments]", [cmd]));
writeln(formatx("Exmpl: %s Admin AdminPassword cmd.exe dir", [cmd]));
end;

begin
// Insert user code here
setconsoletitle("runas.exe");
writeln("runas.exe");

if (ParamCount < 3) then
begin
usage(ParamStr(0));
exit;
end;

Username := ParamStr(1);
Password := ParamStr(2);
CmdLine := ParamStr(3);

hAdvAPI32 := LoadLibrary(ADVAPI32);
if hAdvAPI32 = 0 then
begin
writeln("Failed to load DLL: ", GetLastError);
exit;
end;

@CreateProcessWithLogonW := GetProcAddress(hAdvAPI32, "CreateProcessWithLogonW");
if @CreateProcessWithLogonW = nil then
begin
writeln("Failed to retrieve addresses of exported functions: ", GetLastError);
exit;
end;

fillchar(StartupInfo, sizeof(StartupInfo), #0);
fillchar(ProcessInfo, sizeof(ProcessInfo), #0);
StartupInfo.cb := sizeof(StartupInfo);

GetCurrentDirectory(sizeof(Dir), Dir);

if not CreateProcessWithLogonW(LPCWSTR(Username),
LPCWSTR(nil),
LPCWSTR(Password),
LOGON_WITH_PROFILE,
nil,
LPWSTR(CmdLine),
CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS,
nil,
LPCWSTR(string(Dir)),
StartupInfo,
ProcessInfo) then
begin
writeln("Failed to create process: ", GetLastError);
exit;
end;

readln;
end.


А вот листинг файла convert.pas:

// String functions
{******************************************************************************}
function i2s(value : dword) : string;
const format : pchar = "%d";
var buffer : pchar;
begin
getmem(buffer, 256);
asm
push value
push format
push buffer
call wsprintf
add esp, 0Ch
end;
result := string(buffer);
freemem(buffer);
end;

function s2i(value : string) : dword;
var error : dword;
begin
val(value, result, error);
end;

function formatx(const value : string; const args : array of const) : string;
type arptr = array[0..0] of pointer;
var
_args : ^arptr;
buffer : array[0..4095] of char;
i : integer;
begin
result := "";
i:= length(args);
if i = 0 then exit;

getmem(_args, i * sizeof(pointer));

for i := 0 to i - 1 do
_args[i]:= args[i].vpointer;

i := wvsprintf(buffer, @value[1], pchar(@_args[0]));
setstring(result, buffer, i);

freemem(_args);
end;
{******************************************************************************}


Заранее благодарен.


 
Игорь Шевченко   (2002-12-13 12:22) [1]


> Вот листинг программы, только где-то вылезает ошибка.

А телепатов-то зачем искать ?


 
Василий2   (2002-12-13 12:26) [2]

Игорь Шевченко -> А я не ищу телепатов. Я попросил просто посмотреть и найти ошибку в исходнике.


 
Игорь Шевченко   (2002-12-13 12:56) [3]

Василий2 © (13.12.02 12:26)

Ищешь. Так как не говоришь, какая ошибка возникает и в какое время. На этапе компиляции или на этапе выполнения, текст ошибки и т.д. Ты предлагаешь нам компиляторами и отладчиками работать ?


 
Андрей Ульченко   (2002-12-13 13:44) [4]

Согласен с Игорем, постановка вопроса совершенно не правильная.

Вы Василий просите нас сделать Вашу работу и подумать за Вас.
В место того чтобы указать конкретную проблему и полные данные Вы
даете листинг программы, которая по вашему мнению не работает,
без описания проблемы.

Может она по замыслу работать не должна?


 
Василий2   (2002-12-13 15:40) [5]

Игорь Шевченко -> Нет, не ищу. После вызова CreateProcessWithLogonW в консоле пишется "Runtime Error ...". BTW, исходник-то я дал не просто так, а чтобы Вы запустили, посмотрели что не так. Или Вам лень?

Андрей Ульченко -> Закончи школу для начала.



 
Игорь Шевченко   (2002-12-13 15:57) [6]

Василий2 © (13.12.02 15:40)

Вот такое нахальство, я, честно говоря, впервые вижу... :-)

Дружище, у кого проблема, у нас или у тебя ? Ты просишь о помощи, так расскажи хотя бы, в чем проблема, не в виде ошибки
"Runtime Error ...".
Опять же, с какой травы ты взял, что LPCWSTR(Password) будет преобразовывать в Unicode параметр командной строки, которая вообще-то Ansi...

До GetCommandLineW современная наука не дошла еще ?


> Закончи школу для начала.


Нет дружище, это ты закончи школу и научись правильно задавать вопросы в форуме.


 
Василий2   (2002-12-13 16:29) [7]

Игорь Шевченко ->

1. Я же сказал уже... После вызова CreateProcessWithLogonW вылезает ошибка, а я не никак не пойму ПОЧЕМУ... Может это Вы чего-то не понимаете?


Дружище, у кого проблема, у нас или у тебя ? Ты просишь о помощи, так расскажи хотя бы, в чем проблема, не в виде ошибки
"Runtime Error ...".


2. Вот я и говорю: запустите и посмотрите. Для этого я и дал исходник, иначе бы мы друг друга вообще не поняли.


Опять же, с какой травы ты взял, что LPCWSTR(Password) будет преобразовывать в Unicode параметр командной строки, которая вообще-то Ansi...


3. А как надо?


До GetCommandLineW современная наука не дошла еще ?


4. А это тут причем???



 
Игорь Шевченко   (2002-12-13 17:01) [8]

Василий2 © (13.12.02 16:29)

> Может это Вы чего-то не понимаете?


Не понимаю. Как можно не говорить, какая ошибка а вместо этого напрягать людей на копирование исходника, создание проекта, компиляцию, запуск...Хотя сказать, какая ошибка (без многоточия) гораздо проще.


> А это тут причем???


А это, дружище, получение командной строки с параметрами в виде Unicode. И к ней, для разбиения на параметры, прилагается функция CommandLineToArgvW. Раз уж у тебя параметры функции CreateProcessWithLogonW требуют Unicode-строк, а ты им пытаешься Ansi передавать. После этого мне надо переписывать твою программу, или все-таки, тебе ?


 
Василий2   (2002-12-13 17:10) [9]

Еще раз говорю: дело в том, что я и сам не понимаю какая ошибка. Если без многоточия, то получится: "Runtime error 216 at 00027F27". Я только не пойму для чего это - проблему это не решает.

А почему нельзя просто преобразовать из Ansi в Unicode? ( LPCWSTR(Username))


 
Игорь Шевченко   (2002-12-13 17:23) [10]

Василий2 © (13.12.02 17:10)


> "Runtime error 216 at 00027F27"


Отладчик на что человеку в руки даден ?


> А почему нельзя просто преобразовать из Ansi в Unicode?
> (LPCWSTR(Username))


Это не преобразование. Это приведение типа указателя, а сама строка при этом не преобразовывается.

IMHO, рановато с такими знаниями в CreateProcessWithLogonW лезть, там своих тонкостей хватает...



 
Василий2   (2002-12-13 17:33) [11]

А есть ли функция, которая преобразовывает? Если нет, то как самому сделать? Это будет типа:

Ansi:"ABC"
Unicode:"%41%42%43" ????


 
Игорь Шевченко   (2002-12-13 17:45) [12]

Василий2 © (13.12.02 17:33)

The MultiByteToWideChar function maps a character string to a wide-character (Unicode) string. The character string mapped by this function is not necessarily from a multibyte character set.


 
Ketmar   (2002-12-13 18:43) [13]

2Василий2:
радостно путаем URL encoding и Unicode... RTFM?

Satanas Nobiscum! 13-Dec-XXXVII A.S.


 
Василий2   (2002-12-13 19:00) [14]

Ну все. Я окончательно запутался. Помогите доделать исходник.


 
Василий2   (2002-12-14 09:45) [15]

IMHO, рановато с такими знаниями в CreateProcessWithLogonW лезть, там своих тонкостей хватает...


Может быть и так, но мне ОЧЕНЬ НАДО!


 
Cobalt   (2002-12-17 01:48) [16]

Parameters

lpUsername
[in] Pointer to a null-terminated string that specifies the name of the user. This is the name of the user account to log on to. If you use the UPN format, user@DNS_domain_name, the lpDomain parameter must be NULL.

The user account must have Log On Locally permission on the local computer. This permission is granted to all users on workstations and servers, but only to administrators on domain controllers.
lpDomain
[in] Pointer to a null-terminated string that specifies the name of the domain or server whose account database contains the lpUsername account. If this parameter is NULL, the user name must be specified in UPN format.


 
Deathless   (2003-01-29 05:35) [17]

Вот также я когда-то не мог никак сделать.....

вот это должно работать:
procedure TForm1.Button1Click(Sender: TObject);
var ProcInfo:TProcessInformation;
StartInfo:TStartUpInfo;

User: PWChar;
Password: PWChar;
Cmd: PWChar;

begin
FillChar(StartInfo,SizeOf(StartInfo),0);
with StartInfo do begin
cb := SizeOf(StartInfo);
dwFlags := startf_UseShowWindow;
wShowWindow := 4;
end;

User := PWChar(WideString(EdUser.Text));
Password := PWChar(WideString(EdPassword.Text));
Cmd := PWChar(WideString(EdCmd.Text));

if createprocessWithLogonW
(User, // pointer to thread security attributes
nil,
Password,
1,
nil, // pointer to name of executable module
Cmd, // pointer to command line string
NORMAL_PRIORITY_CLASS or
CREATE_NEW_CONSOLE, // creation flags
nil, // pointer to new environment block
nil, // pointer to current directory name
StartInfo, // pointer to STARTUPINFO
ProcInfo) // pointer to PROCESS_INFORMATION;
then edit1.Text := "True"
else edit1.Text := "False";
end;



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2003.03.24;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.009 c
8-76527
ДокКир
2002-12-14 15:18
2003.03.24
Графика


1-76451
msoftware
2003-03-12 09:06
2003.03.24
Как нормально добавить Bitmap в ImageList?


8-76531
Daf
2002-12-15 11:46
2003.03.24
Как проиграть mid из exe-шника?


8-76520
SPIRIT
2002-12-12 13:50
2003.03.24
Прочитать TAG в MP3


14-76661
hatchy
2003-03-07 14:30
2003.03.24
Sharewere





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский