<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=62774&amp;view=findpost&amp;p=431040</guid>
        <pubDate>Mon, 16 Aug 2004 05:30:36 +0000</pubDate>
        <title>Помогите с процессами</title>
        <link>https://forum.sources.ru/index.php?showtopic=62774&amp;view=findpost&amp;p=431040</link>
        <description><![CDATA[piton_zel: Нет не работает. Тут видешь какая фишка, если прогу запустить по system, например как службу, то это будет работать, а если из под пользователя, в данном случае администратора, то нет. А все это происходит из-за того, что у пользователей нет прав, а именно &quot;SeTcbPrivilege&quot;. Вот и приходиться сначала установить эту привелегию, а потом выполнять LogonUser. Причем, такой геморой наблюдается только в NT,W2K, поговаривают, что в XP такого нет.<br>Вопрос, пока, так и остался открытым....]]></description>
        <author>piton_zel</author>
        <category>Delphi: Система, Windows API</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=62774&amp;view=findpost&amp;p=430341</guid>
        <pubDate>Sat, 14 Aug 2004 18:17:12 +0000</pubDate>
        <title>Помогите с процессами</title>
        <link>https://forum.sources.ru/index.php?showtopic=62774&amp;view=findpost&amp;p=430341</link>
        <description><![CDATA[P.O.D: <div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '><strong class='tag-b'>piton_zel</strong>, 14.08.04, 16:59<br>
А привилегии нужны, чтобы я мог выполнить функцию LogonUser</div></div><br>
вроде нет...<br>
так работает ?<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&nbsp;</div><div class="code_line">if LogonUser( &#39;test&#39;, &#39;piton&#39;, &#39;1234&#39;, LOGON32_LOGON_NETWORK, LOGON32_PROVIDER_DEFAULT, hToken )</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;then WriteLn(&#39;Succeeded, token = 0x&#39;+IntToHex(hToken,8))</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;else WriteLn(&#39;Logon failed. &#39;+strtooem(winerrorasstring(getlasterror)));</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Result:= CreateProcessAsUser( hToken, nil,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;pChar(ExeScript), // command line</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;nil, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// process security attributes</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;nil, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// primary thread security attributes</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;true, &nbsp; &nbsp; &nbsp; &nbsp; // handles are inherited</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;0, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// creation flags</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;nil, &nbsp; // use parent&#39;s environment</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;pChar(WorkDir), // use parent&#39;s current directory</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;StartInfo, &nbsp; &nbsp;// STARTUPINFO pointer</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;ProcInfo); &nbsp; &nbsp;// receives PROCESS_INFORMATION</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script>]]></description>
        <author>P.O.D</author>
        <category>Delphi: Система, Windows API</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=62774&amp;view=findpost&amp;p=430245</guid>
        <pubDate>Sat, 14 Aug 2004 12:59:53 +0000</pubDate>
        <title>Помогите с процессами</title>
        <link>https://forum.sources.ru/index.php?showtopic=62774&amp;view=findpost&amp;p=430245</link>
        <description><![CDATA[piton_zel: <div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <span class='tag-quote__quote-info'>P.O.D &#064; 14.08.04, 15:28</span><div class='quote '><strong class='tag-b'>piton_zel</strong>, привилегий не надо, попробуй сразу LogonUser(...)</div></div><br>
дык... У меня весь смысл в этом и сидит, мне надо запустить процесс под другими пользователем. А привилегии нужны, чтобы я мог выполнить функцию LogonUser. хех, может я не правильно выражаюсь?.. смысл такой, мне надо запустить программу и что бы эта прога не наделал гадостей системе, т.е. под учетной записью у которой будет все закрыто, кроме доступа к одному каталогу. Самое интересное, что это дело работает под SYSTEM, т.е. как сервис, но мне это надо запускать из под админа. вот, пока не знаю как и решить данный вопрос...]]></description>
        <author>piton_zel</author>
        <category>Delphi: Система, Windows API</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=62774&amp;view=findpost&amp;p=430216</guid>
        <pubDate>Sat, 14 Aug 2004 12:28:47 +0000</pubDate>
        <title>Помогите с процессами</title>
        <link>https://forum.sources.ru/index.php?showtopic=62774&amp;view=findpost&amp;p=430216</link>
        <description><![CDATA[P.O.D: <strong class='tag-b'>piton_zel</strong>, привилегий не надо, попробуй сразу LogonUser(...)]]></description>
        <author>P.O.D</author>
        <category>Delphi: Система, Windows API</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=62774&amp;view=findpost&amp;p=430207</guid>
        <pubDate>Sat, 14 Aug 2004 12:12:56 +0000</pubDate>
        <title>Помогите с процессами</title>
        <link>https://forum.sources.ru/index.php?showtopic=62774&amp;view=findpost&amp;p=430207</link>
        <description><![CDATA[piton_zel: Вот, что-то родил, но тоже пока без результа... LogonUser почему-то сообщает: Logon failed. Клиент не обладает требуемыми правами.<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;if not OpenProcessToken(GetCurrentProcess,TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,hToken)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;then WriteLn(&#39;ERROR: &#39;+strtooem(winerrorasstring(getlasterror)));</div><div class="code_line">&nbsp;&nbsp; &nbsp;if not LookupPrivilegeValue(nil,&#39;SeTcbPrivilege&#39;,tkp.Privileges[0].Luid)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;then WriteLn(&#39;ERROR: &#39;+strtooem(winerrorasstring(getlasterror)));</div><div class="code_line">&nbsp;&nbsp; &nbsp;tkp.PrivilegeCount:= 1;</div><div class="code_line">&nbsp;&nbsp; &nbsp;tkp.Privileges[0].Attributes:= SE_PRIVILEGE_ENABLED;</div><div class="code_line">&nbsp;&nbsp; &nbsp;dwNull:= 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp;if not AdjustTokenPrivileges(hToken,FALSE,tkp,SizeOf(TTokenPrivileges),tmp,dwNull)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;then WriteLn(&#39;ERROR: &#39;+strtooem(winerrorasstring(getlasterror)));</div><div class="code_line">&nbsp;&nbsp; &nbsp;CloseHandle(hToken);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;if LogonUser( &#39;test&#39;, &#39;piton&#39;, &#39;1234&#39;, LOGON32_LOGON_NETWORK, LOGON32_PROVIDER_DEFAULT, hToken )</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;then WriteLn(&#39;Succeeded, token = 0x&#39;+IntToHex(hToken,8))</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;else WriteLn(&#39;Logon failed. &#39;+strtooem(winerrorasstring(getlasterror)));</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Result:= CreateProcessAsUser( hToken, nil,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;pChar(ExeScript), // command line</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;nil, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// process security attributes</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;nil, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// primary thread security attributes</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;true, &nbsp; &nbsp; &nbsp; &nbsp; // handles are inherited</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;0, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// creation flags</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;nil, &nbsp; // use parent&#39;s environment</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;pChar(WorkDir), // use parent&#39;s current directory</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;StartInfo, &nbsp; &nbsp;// STARTUPINFO pointer</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;ProcInfo); &nbsp; &nbsp;// receives PROCESS_INFORMATION</div></ol></div></div></div></div>]]></description>
        <author>piton_zel</author>
        <category>Delphi: Система, Windows API</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=62774&amp;view=findpost&amp;p=430164</guid>
        <pubDate>Sat, 14 Aug 2004 10:49:55 +0000</pubDate>
        <title>Помогите с процессами</title>
        <link>https://forum.sources.ru/index.php?showtopic=62774&amp;view=findpost&amp;p=430164</link>
        <description><![CDATA[piton_zel: <div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <span class='tag-quote__quote-info'>P.O.D &#064; 13.08.04, 19:59</span><div class='quote '><strong class='tag-b'>piton_zel</strong>, большой код, неахота смотреть ;)<br>
А почему не юзаеть документированную ф-цию CreateProcessAsUser, вместо недокументировванной CreateProcessWithLogon ?</div></div><br>
хм... сейчас посмотрю, что это за зверь...]]></description>
        <author>piton_zel</author>
        <category>Delphi: Система, Windows API</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=62774&amp;view=findpost&amp;p=429812</guid>
        <pubDate>Fri, 13 Aug 2004 16:59:00 +0000</pubDate>
        <title>Помогите с процессами</title>
        <link>https://forum.sources.ru/index.php?showtopic=62774&amp;view=findpost&amp;p=429812</link>
        <description><![CDATA[P.O.D: <strong class='tag-b'>piton_zel</strong>, большой код, неахота смотреть ;)<br>
А почему не юзаеть документированную ф-цию CreateProcessAsUser, вместо недокументировванной CreateProcessWithLogon ?]]></description>
        <author>P.O.D</author>
        <category>Delphi: Система, Windows API</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=62774&amp;view=findpost&amp;p=429736</guid>
        <pubDate>Fri, 13 Aug 2004 15:04:24 +0000</pubDate>
        <title>Помогите с процессами</title>
        <link>https://forum.sources.ru/index.php?showtopic=62774&amp;view=findpost&amp;p=429736</link>
        <description><![CDATA[piton_zel: Помогите народ, уже неделю бъюсь, а результат ноль. Мне надо запустить другой процесс (консольная программа) под другим пользователем и перехватить всю информацию выводимую в консольном окне. Процес запускается, выполняется, а вот что он там пишет я не как не могу перехватить. Где у меня ошибка???<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&nbsp;</div><div class="code_line">program Project3;</div><div class="code_line">&nbsp;</div><div class="code_line">{$APPTYPE CONSOLE}</div><div class="code_line">&nbsp;</div><div class="code_line">uses</div><div class="code_line">&nbsp;&nbsp;Windows, SysUtils;</div><div class="code_line">&nbsp;</div><div class="code_line">type</div><div class="code_line">&nbsp;&nbsp;TCreateProcessWithLogonW =</div><div class="code_line">&nbsp;&nbsp; &nbsp;function(const lpUsername: PWideChar;</div><div class="code_line">&nbsp;&nbsp; &nbsp;const lpDomain: PWideChar; const lpPassword: PWideChar;</div><div class="code_line">&nbsp;&nbsp; &nbsp;dwLogonFlags: DWORD; const lpApplicationName: PWideChar;</div><div class="code_line">&nbsp;&nbsp; &nbsp;lpCommandLine: PWideChar; dwCreationFlags: DWORD;</div><div class="code_line">&nbsp;&nbsp; &nbsp;lpEnvironment: Pointer; const lpCurrentDirectory: PWideChar;</div><div class="code_line">&nbsp;&nbsp; &nbsp;lpStartupInfo: PStartupInfo;</div><div class="code_line">&nbsp;&nbsp; &nbsp;lpProcessInfo: PProcessInformation): Boolean; stdcall;</div><div class="code_line">&nbsp;</div><div class="code_line">const</div><div class="code_line">&nbsp;&nbsp;DllName = &#39;advapi32.dll&#39;;</div><div class="code_line">&nbsp;&nbsp;LOGON_WITH_PROFILE = {text}000001;</div><div class="code_line">&nbsp;&nbsp;LOGON_NETCREDENTIALS_ONLY = {text}000002;</div><div class="code_line">&nbsp;&nbsp;LOGON_ZERO_PASSWORD_BUFFER = 000000;</div><div class="code_line">&nbsp;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;DllHandle: THandle;</div><div class="code_line">&nbsp;&nbsp;_CreateProcessWithLogonW: TCreateProcessWithLogonW;</div><div class="code_line">&nbsp;</div><div class="code_line">////////////////////////////////////////////////////////////////////////////////</div><div class="code_line">function InitLib: Boolean;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;if DllHandle = 0 then</div><div class="code_line">&nbsp;&nbsp; &nbsp;if Win32Platform = VER_PLATFORM_WIN32_NT then begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;DllHandle:= LoadLibrary(DllName);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if DllHandle &#60;&#62; 0</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;then @_CreateProcessWithLogonW:= GetProcAddress(DllHandle,&#39;CreateProcessWithLogonW&#39;);</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp;Result:= ( DllHandle &#60;&#62; 0 );</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">////////////////////////////////////////////////////////////////////////////////</div><div class="code_line">function NotImplementedBool: Boolean;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;SetLastError(ERROR_CALL_NOT_IMPLEMENTED);</div><div class="code_line">&nbsp;&nbsp;Result:= false;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">////////////////////////////////////////////////////////////////////////////////</div><div class="code_line">function CreateProcessWithLogonW(const lpUsername: PWideChar;</div><div class="code_line">&nbsp;&nbsp;const lpDomain: PWideChar; const lpPassword: PWideChar;</div><div class="code_line">&nbsp;&nbsp;dwLogonFlags: DWORD; const lpApplicationName: PWideChar;</div><div class="code_line">&nbsp;&nbsp;lpCommandLine: PWideChar; dwCreationFlags: DWORD;</div><div class="code_line">&nbsp;&nbsp;lpEnvironment: Pointer; const lpCurrentDirectory: PWideChar;</div><div class="code_line">&nbsp;&nbsp;lpStartupInfo: PStartupInfo;</div><div class="code_line">&nbsp;&nbsp;lpProcessInfo: PProcessInformation): Boolean; stdcall;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;if InitLib and Assigned(_CreateProcessWithLogonW) then</div><div class="code_line">&nbsp;&nbsp; &nbsp;Result:= _CreateProcessWithLogonW( lpUsername, lpDomain, lpPassword,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;dwLogonFlags, lpApplicationName, lpCommandLine, dwCreationFlags,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;lpEnvironment, lpCurrentDirectory, lpStartupInfo, lpProcessInfo )</div><div class="code_line">&nbsp;&nbsp;else Result:= NotImplementedBool;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">////////////////////////////////////////////////////////////////////////////////</div><div class="code_line">function WinErrorAsString( id : integer ): string;</div><div class="code_line">var a: array[ 0..MAX_PATH ] of char;</div><div class="code_line">begin</div><div class="code_line">//SysErrorMessage... тоже самое???</div><div class="code_line">&nbsp;&nbsp;FillChar( a, SizeOf( a ), #0 );</div><div class="code_line">&nbsp;&nbsp;FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM, nil, id, LANG_SYSTEM_DEFAULT, @a, MAX_PATH, nil );</div><div class="code_line">&nbsp;&nbsp;result:= StrPas( a );</div><div class="code_line">&nbsp;&nbsp;while pos( #13, result ) &#62; 0 do result[ pos( #13, result ) ]:= &#39; &#39;;</div><div class="code_line">&nbsp;&nbsp;while pos( #10, Result ) &#62; 0 do Delete( result, pos( #10, result ), 1 );</div><div class="code_line">end; // WinErrorAsString</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">////////////////////////////////////////////////////////////////////////////////</div><div class="code_line">function ExecuteExternal( CompilerName, ScriptName: String; out Data: string ): Boolean;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;StartInfo: TStartupInfo;</div><div class="code_line">&nbsp;&nbsp;ProcInfo: TProcessInformation;</div><div class="code_line">&nbsp;&nbsp;Len, ExitCode: DWORD;</div><div class="code_line">&nbsp;&nbsp;Tmp1, Tmp2: THandle;</div><div class="code_line">&nbsp;&nbsp;SA_Attr: PSecurityAttributes;</div><div class="code_line">&nbsp;&nbsp;ChildStdoutRd: THandle;</div><div class="code_line">&nbsp;&nbsp;ChildStdoutWr: THandle;</div><div class="code_line">&nbsp;&nbsp;ChildStdinRd: THandle;</div><div class="code_line">&nbsp;&nbsp;ChildStdinWr: THandle;</div><div class="code_line">&nbsp;&nbsp;s, st: String;</div><div class="code_line">&nbsp;&nbsp;f: Integer;</div><div class="code_line">&nbsp;&nbsp;WorkDir, ExeScript: String;</div><div class="code_line">&nbsp;&nbsp;dwWritten: cardinal;</div><div class="code_line">&nbsp;&nbsp;UserName: array[0..512] of WideChar;</div><div class="code_line">&nbsp;&nbsp;Password: array[0..512] of WideChar;</div><div class="code_line">&nbsp;&nbsp;CommandLine: array[0..512] of WideChar;</div><div class="code_line">&nbsp;&nbsp;Domain: array[0..512] of WideChar;</div><div class="code_line">&nbsp;&nbsp;WorkDirectory: array[0..512] of WideChar;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;// --- Read from pipe...</div><div class="code_line">&nbsp;&nbsp;function ReadStrFromChild( var Data: String ): Boolean;</div><div class="code_line">&nbsp;&nbsp;var</div><div class="code_line">&nbsp;&nbsp; &nbsp;dwRead, BufSize: DWORD;</div><div class="code_line">&nbsp;&nbsp; &nbsp;st: String;</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;BufSize:= 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Data:= &#39;&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;repeat</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Result:= PeekNamedPipe( ChildStdoutRd, nil, 0, nil, @BufSize, nil );</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if Result and ( BufSize &#62; 0 ) then begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;SetLength( st, BufSize );</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Result:= ReadFile( ChildStdoutRd, st[1], BufSize, dwRead, nil )and( dwRead = BufSize );</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if not Result then exit;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Data:= Data + Copy( st, 1, dwRead );</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp;until not Result or( BufSize = 0 );</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">begin</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;Data:= &#39;&#39;;</div><div class="code_line">&nbsp;&nbsp;Result:= False;</div><div class="code_line">&nbsp;&nbsp;ProcInfo.hProcess:= 0;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;for f:= 1 to Length(CompilerName) do</div><div class="code_line">&nbsp;&nbsp; &nbsp;if CompilerName[f] = &#39;/&#39; then CompilerName[f]:= &#39;\&#39;;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;WorkDir:= ExtractFilePath(CompilerName);</div><div class="code_line">&nbsp;&nbsp;if ScriptName = &#39;&#39; then ExeScript:= CompilerName</div><div class="code_line">&nbsp;&nbsp; &nbsp;else ExeScript:= CompilerName+&#39; &#39;+ScriptName;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;// --- Execute script...</div><div class="code_line">&nbsp;&nbsp;New(SA_Attr);</div><div class="code_line">&nbsp;&nbsp;try</div><div class="code_line">&nbsp;&nbsp; &nbsp;SA_Attr.nLength:= SizeOf(SECURITY_ATTRIBUTES);</div><div class="code_line">&nbsp;&nbsp; &nbsp;SA_Attr.bInheritHandle:= true;</div><div class="code_line">&nbsp;&nbsp; &nbsp;SA_Attr.lpSecurityDescriptor:= nil;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;// --- Создаем &quot;читальный&quot; Pipe...</div><div class="code_line">&nbsp;&nbsp; &nbsp;if not CreatePipe( ChildStdoutRd, &nbsp;ChildStdoutWr, SA_Attr, 0 ) then begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;WriteLn(&#39;ERROR: Create Pipe. &#39;+WinErrorAsString(GetLastError));</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;exit;</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;// --- Создаем &quot;писальный&quot; Pipe...</div><div class="code_line">&nbsp;&nbsp; &nbsp;if not CreatePipe( ChildStdinRd, ChildStdinWr, SA_Attr, 0 ) then begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;WriteLn(&#39;ERROR: Create Pipe. &#39;+WinErrorAsString(GetLastError));</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;exit;</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;// --- Делаем НЕ наследуемый дубликат &quot;Читального&quot; (Read) конца Pipe&#39;a....</div><div class="code_line">&nbsp;&nbsp; &nbsp;// --- Это нужно, я так полагаю, чтобы не тащить лишние хэндлы в дочерний процесс...</div><div class="code_line">&nbsp;&nbsp; &nbsp;if not DuplicateHandle( GetCurrentProcess(), ChildStdoutRd, GetCurrentProcess(), @Tmp1, 0, False, DUPLICATE_SAME_ACCESS ) then begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;WriteLn(&#39;ERROR: DuplicateHandle. &#39;+WinErrorAsString(GetLastError));</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;exit;</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp;if not DuplicateHandle( GetCurrentProcess(), ChildStdinWr, GetCurrentProcess(), @Tmp2, 0, False, DUPLICATE_SAME_ACCESS ) then begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;WriteLn(&#39;ERROR: DuplicateHandle. &#39;+WinErrorAsString(GetLastError));</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;exit;</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;CloseHandle(ChildStdoutRd);//Закроем наследуемый вариант &quot;Читального&quot; хэндла</div><div class="code_line">&nbsp;&nbsp; &nbsp;CloseHandle(ChildStdinWr); //Закроем наследуемый вариант &quot;Писального&quot; хэндла</div><div class="code_line">&nbsp;&nbsp; &nbsp;ChildStdoutRd:= Tmp1; &nbsp; &nbsp; &nbsp;//И воткнем их места НЕ наследуемые дубликаты</div><div class="code_line">&nbsp;&nbsp; &nbsp;ChildStdinWr:= Tmp2; &nbsp; &nbsp; &nbsp; //И воткнем их места НЕ наследуемые дубликаты</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;// --- Запускаем-с...</div><div class="code_line">&nbsp;&nbsp; &nbsp;// --- Set up members of STARTUPINFO structure...</div><div class="code_line">&nbsp;&nbsp; &nbsp;ZeroMemory( @StartInfo, SizeOf(TStartupInfo) );</div><div class="code_line">&nbsp;&nbsp; &nbsp;StartInfo.cb:= SizeOf(TStartupInfo);</div><div class="code_line">&nbsp;&nbsp; &nbsp;StartInfo.hStdInput:= ChildStdinRd;</div><div class="code_line">&nbsp;&nbsp; &nbsp;StartInfo.hStdOutput:= ChildStdoutWr;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;StartInfo.dwFlags:= STARTF_USESTDHANDLES;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;// --- Create the child process...</div><div class="code_line">&nbsp;&nbsp; &nbsp;FillChar( CommandLine, Length(CommandLine)*SizeOf(WideChar), 0 );</div><div class="code_line">&nbsp;&nbsp; &nbsp;StringToWideChar( ExeScript, CommandLine, Sizeof(CommandLine) div SizeOf(WideChar) );</div><div class="code_line">&nbsp;&nbsp; &nbsp;s:= &#39;test&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;FillChar( UserName, Length(UserName)*SizeOf(WideChar), 0 );</div><div class="code_line">&nbsp;&nbsp; &nbsp;StringToWideChar( s, UserName, Sizeof(UserName) div SizeOf(WideChar) );</div><div class="code_line">&nbsp;&nbsp; &nbsp;s:= &#39;1234&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;FillChar( Password, Length(Password)*SizeOf(WideChar), 0 );</div><div class="code_line">&nbsp;&nbsp; &nbsp;StringToWideChar( s, Password, Sizeof(Password) div SizeOf(WideChar) );</div><div class="code_line">&nbsp;&nbsp; &nbsp;FillChar( WorkDirectory, Length(WorkDirectory)*SizeOf(WideChar), 0 );</div><div class="code_line">&nbsp;&nbsp; &nbsp;StringToWideChar( WorkDir, WorkDirectory, Sizeof(WorkDirectory) div SizeOf(WideChar) );</div><div class="code_line">&nbsp;&nbsp; &nbsp;Len:= 1024;</div><div class="code_line">&nbsp;&nbsp; &nbsp;SetString( st, nil, Len );</div><div class="code_line">&nbsp;&nbsp; &nbsp;FillChar( st[1], Len, 0 );</div><div class="code_line">&nbsp;&nbsp; &nbsp;GetComputerName( pChar(st), Len );</div><div class="code_line">&nbsp;&nbsp; &nbsp;st:= Copy( st, 1, Len );</div><div class="code_line">&nbsp;&nbsp; &nbsp;FillChar( Domain, Length(Domain)*SizeOf(WideChar), 0 );</div><div class="code_line">&nbsp;&nbsp; &nbsp;StringToWideChar( st, Domain, Sizeof(Domain) div SizeOf(WideChar) );</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Result:= CreateProcessWithLogonW(</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;UserName,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Domain,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Password,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;//LOGON_WITH_PROFILE,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;LOGON_NETCREDENTIALS_ONLY,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;nil,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;CommandLine,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;0,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;nil,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;WorkDirectory,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;@StartInfo,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;@ProcInfo);</div><div class="code_line">&nbsp;&nbsp; &nbsp;(*</div><div class="code_line">&nbsp;&nbsp; &nbsp;Result:= CreateProcess( nil,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;pChar(ExeScript), // command line</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;nil, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// process security attributes</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;nil, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// primary thread security attributes</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;true, &nbsp; &nbsp; &nbsp; &nbsp; // handles are inherited</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;0, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// creation flags</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;nil, &nbsp; // use parent&#39;s environment</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;pChar(WorkDir), // use parent&#39;s current directory</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;StartInfo, &nbsp; &nbsp;// STARTUPINFO pointer</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;ProcInfo); &nbsp; &nbsp;// receives PROCESS_INFORMATION</div><div class="code_line">&nbsp;&nbsp; &nbsp;*)</div><div class="code_line">&nbsp;&nbsp; &nbsp;if not Result then begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;WriteLn(&#39;ERROR: CreateProcess &#39;+WinErrorAsString(GetLastError));</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;exit;</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;WaitForInputIdle(ProcInfo.hProcess, INFINITE);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;// --- Вводим информацию...</div><div class="code_line">&nbsp;&nbsp; &nbsp;Data:= &#39;ля-ля-ля...&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;WriteFile( ChildStdinWr, Data[1], Length(Data), dwWritten, nil );</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;// --- Читаем информацию...</div><div class="code_line">&nbsp;&nbsp; &nbsp;Data:= &#39;&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;repeat</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;GetExitCodeThread( ProcInfo.hThread, ExitCode );</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if not ReadStrFromChild(st) then begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;WriteLn(&#39;ERROR: ReadStrFromChild. &#39;+WinErrorAsString(GetLastError),True);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;exit;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Data:= Data + st;</div><div class="code_line">&nbsp;&nbsp; &nbsp;until ExitCode &#60;&#62; STILL_ACTIVE;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;// --- Удачно-ли завершен скрипт?..</div><div class="code_line">&nbsp;&nbsp; &nbsp;if ExitCode &#60;&#62; NOERROR then begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;WriteLn(&#39;ERROR: ExitCode = &#39;+inttostr(ExitCode)+&#39;. script &quot;&#39;+ExeScript+&#39;&quot;.&#39;,True);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;exit;</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;// ---- ну тут далее, но это уже не относится к делу...</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;finally</div><div class="code_line">&nbsp;&nbsp; &nbsp;if ProcInfo.hProcess &#60;&#62; 0 then begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;CloseHandle(ProcInfo.hProcess);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;CloseHandle(ProcInfo.hThread);</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp;//Закрываем хэндлы пайпов</div><div class="code_line">&nbsp;&nbsp; &nbsp;CloseHandle(ChildStdoutRd);</div><div class="code_line">&nbsp;&nbsp; &nbsp;CloseHandle(ChildStdoutWr);</div><div class="code_line">&nbsp;&nbsp; &nbsp;CloseHandle(ChildStdinRd);</div><div class="code_line">&nbsp;&nbsp; &nbsp;CloseHandle(ChildStdinWr);</div><div class="code_line">&nbsp;&nbsp; &nbsp;Dispose(SA_Attr);</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;Data: String;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;ExecuteExternal(&#39;N:\work\_Net\WEBServer\_ts\Project2.exe 123456&#39;,&#39;&#39;,Data);</div><div class="code_line">&nbsp;&nbsp;WriteLn(Data);</div><div class="code_line">&nbsp;&nbsp;Write(&#39;FINISH&#39;); ReadLn;</div><div class="code_line">end.</div></ol></div></div></div></div>]]></description>
        <author>piton_zel</author>
        <category>Delphi: Система, Windows API</category>
      </item>
	
      </channel>
      </rss>
	