<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DZone Snippets: windows code</title>
    <link>http://snippets.dzone.com/posts</link>
    <pubDate>Fri, 25 Jul 2008 04:26:10 GMT</pubDate>
    <description>DZone Snippets: windows code</description>
    <item>
      <title>Thread Process //Pascal class</title>
      <link>http://snippets.dzone.com/posts/show/5729</link>
      <description>A thread class to open processes on windows and retrieve its output (input isn't supported but it's easy to add).&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;unit Process;&lt;br /&gt;&lt;br /&gt;interface&lt;br /&gt;&lt;br /&gt;uses&lt;br /&gt;  SysUtils, Windows, Classes, TLHelp32;&lt;br /&gt;&lt;br /&gt;const&lt;br /&gt;  INITIALIZATION_TIMEOUT = 10000;&lt;br /&gt;&lt;br /&gt;type&lt;br /&gt;  TStringArray = array of string;&lt;br /&gt;  TProcessArray = array of Cardinal;&lt;br /&gt;  TExceptionEvent = procedure(Sender: TObject; Exception: Exception) of object;&lt;br /&gt;  EProcessError = class(Exception);&lt;br /&gt;&lt;br /&gt;  TProcessThread = class(TThread)&lt;br /&gt;  private&lt;br /&gt;    FException: Exception;&lt;br /&gt;    FWatching, FStarted, FSuspended: Boolean;&lt;br /&gt;    FDirectory, FPath, FCommandLine, FEnvironment: PChar;&lt;br /&gt;    FData: string;&lt;br /&gt;    FOnProcessTerminated, FOnDataAvailable: TNotifyEvent;&lt;br /&gt;    InputRead, InputWrite, OutputRead, OutputWrite: THandle;&lt;br /&gt;    FMainProcess: PROCESS_INFORMATION;&lt;br /&gt;    FOnException: TExceptionEvent;&lt;br /&gt;    FOnProcessStarted: TNotifyEvent;&lt;br /&gt;    function GetPriority: TThreadPriority;&lt;br /&gt;    procedure SetPriority(const Value: TThreadPriority);&lt;br /&gt;    procedure FreeResources;&lt;br /&gt;  protected&lt;br /&gt;    procedure CallDataAvailable; virtual;&lt;br /&gt;    procedure CallProcessTerminated; virtual;&lt;br /&gt;    procedure CallProcessOpened; virtual;&lt;br /&gt;    procedure CallException; virtual;&lt;br /&gt;    procedure Execute; override;&lt;br /&gt;  public&lt;br /&gt;    constructor Create(Path, CommandLine, Directory: string; Environment: TStrings = nil; Watch: Boolean = True);&lt;br /&gt;    destructor Destroy; override;&lt;br /&gt;&lt;br /&gt;    function IsProcessAlive: Boolean;&lt;br /&gt;    procedure Resume;&lt;br /&gt;    procedure Suspend;&lt;br /&gt;    property OnDataAvailable: TNotifyEvent read FOnDataAvailable write FOnDataAvailable;&lt;br /&gt;    property OnProcessTerminated: TNotifyEvent read FOnProcessTerminated write FOnProcessTerminated;&lt;br /&gt;    property OnProcessStarted: TNotifyEvent read FOnProcessStarted write FOnProcessStarted;&lt;br /&gt;    property OnException: TExceptionEvent read FOnException write FOnException;&lt;br /&gt;    property Data: string read FData;&lt;br /&gt;    property Process: PROCESS_INFORMATION read FMainProcess;&lt;br /&gt;    property Priority: TThreadPriority read GetPriority write SetPriority;&lt;br /&gt;&lt;br /&gt;  end;&lt;br /&gt;&lt;br /&gt;  TProcessLineThread = class;&lt;br /&gt;  TOnNewLineEvent = procedure(ProcessLine:  TProcessLineThread; const Line: string) of object;&lt;br /&gt;  TProcessLineThread = class(TProcessThread)&lt;br /&gt;  private&lt;br /&gt;    FCurrentLine: string;&lt;br /&gt;    FOnNewLine: TOnNewLineEvent;&lt;br /&gt;    procedure DataAvailable(Sender: TObject);&lt;br /&gt;    procedure Finished(Sender: TObject);&lt;br /&gt;  public&lt;br /&gt;    constructor Create(Path, CommandLine, Directory: string; Environment: TStrings = nil);&lt;br /&gt;    property OnNewLine: TOnNewLineEvent read FOnNewLine write FOnNewLine;&lt;br /&gt;  end;&lt;br /&gt;&lt;br /&gt;function KillProcess(const Process: Cardinal): Boolean;&lt;br /&gt;function GetChildrenProcesses(const Process: Cardinal; const IncludeParent: Boolean = True): TProcessArray;&lt;br /&gt;&lt;br /&gt;implementation&lt;br /&gt;&lt;br /&gt;const&lt;br /&gt;  Priorities: array [TThreadPriority] of Integer =&lt;br /&gt;   (THREAD_PRIORITY_IDLE, THREAD_PRIORITY_LOWEST, THREAD_PRIORITY_BELOW_NORMAL,&lt;br /&gt;    THREAD_PRIORITY_NORMAL, THREAD_PRIORITY_ABOVE_NORMAL,&lt;br /&gt;    THREAD_PRIORITY_HIGHEST, THREAD_PRIORITY_TIME_CRITICAL);&lt;br /&gt;&lt;br /&gt;function GetChildrenProcesses(const Process: Cardinal; const IncludeParent: Boolean): TProcessArray;&lt;br /&gt;var&lt;br /&gt;  Snapshot: Cardinal;&lt;br /&gt;  ProcessList: PROCESSENTRY32;&lt;br /&gt;  Current: Integer;&lt;br /&gt;begin&lt;br /&gt;  Current := 0;&lt;br /&gt;  SetLength(Result, 1);&lt;br /&gt;  Result[0] := Process;&lt;br /&gt;  repeat&lt;br /&gt;    ProcessList.dwSize := SizeOf(PROCESSENTRY32);&lt;br /&gt;    Snapshot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);&lt;br /&gt;    if (Snapshot = INVALID_HANDLE_VALUE) or not Process32First(Snapshot, ProcessList) then&lt;br /&gt;      Continue;&lt;br /&gt;    repeat&lt;br /&gt;      if ProcessList.th32ParentProcessID = Result[Current] then&lt;br /&gt;      begin&lt;br /&gt;        SetLength(Result, Length(Result) + 1);&lt;br /&gt;        Result[Length(Result) - 1] := ProcessList.th32ProcessID;&lt;br /&gt;      end;&lt;br /&gt;    until Process32Next(Snapshot, ProcessList) = False;&lt;br /&gt;    Inc(Current);&lt;br /&gt;  until Current &gt;= Length(Result);&lt;br /&gt;  if not IncludeParent then&lt;br /&gt;    Result := Copy(Result, 2, Length(Result));&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;function KillProcess(const Process: Cardinal): Boolean;&lt;br /&gt;var&lt;br /&gt;  Handle: Cardinal;&lt;br /&gt;  List: TProcessArray;&lt;br /&gt;  I: Integer;&lt;br /&gt;begin&lt;br /&gt;  Result := True;&lt;br /&gt;  List := GetChildrenProcesses(Process);&lt;br /&gt;  for I := Length(List) - 1 downto 0 do&lt;br /&gt;    if Result then&lt;br /&gt;    begin&lt;br /&gt;      Handle := OpenProcess(PROCESS_TERMINATE, false, List[I]);&lt;br /&gt;      Result := (Handle &lt;&gt; 0) and TerminateProcess(Handle, 0) and CloseHandle(Handle);&lt;br /&gt;    end;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;{ TProcessThread }&lt;br /&gt;&lt;br /&gt;procedure TProcessThread.CallDataAvailable;&lt;br /&gt;begin&lt;br /&gt;  if Assigned(FOnDataAvailable) then&lt;br /&gt;    FOnDataAvailable(Self);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TProcessThread.Resume;&lt;br /&gt;var&lt;br /&gt;  SuspendCount: Integer;&lt;br /&gt;begin&lt;br /&gt;  if FStarted then&lt;br /&gt;  begin&lt;br /&gt;    FStarted := True;&lt;br /&gt;    SuspendCount := ResumeThread(FMainProcess.hThread);&lt;br /&gt;    CheckThreadError(SuspendCount &gt;= 0);&lt;br /&gt;    if SuspendCount = 1 then&lt;br /&gt;      FSuspended := False;&lt;br /&gt;  end;&lt;br /&gt;  inherited Resume;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;function TProcessThread.GetPriority: TThreadPriority;&lt;br /&gt;begin&lt;br /&gt;  if FStarted then&lt;br /&gt;  begin&lt;br /&gt;    CheckThreadError(GetThreadPriority(FMainProcess.hThread) &lt;&gt; THREAD_PRIORITY_ERROR_RETURN);&lt;br /&gt;  end;&lt;br /&gt;  Result := inherited Priority;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;function TProcessThread.IsProcessAlive: Boolean;&lt;br /&gt;var&lt;br /&gt;  Status: Cardinal;&lt;br /&gt;begin&lt;br /&gt;  GetExitCodeProcess(FMainProcess.hProcess, Status);&lt;br /&gt;  Result := Status = STILL_ACTIVE;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TProcessThread.SetPriority(const Value: TThreadPriority);&lt;br /&gt;begin&lt;br /&gt;  if FStarted then&lt;br /&gt;    CheckThreadError(SetThreadPriority(FMainProcess.hThread, Priorities[Value]));&lt;br /&gt;  inherited Priority := Value;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TProcessThread.Suspend;&lt;br /&gt;var&lt;br /&gt;  OldSuspend: Boolean;&lt;br /&gt;begin&lt;br /&gt;  if FStarted then&lt;br /&gt;  begin&lt;br /&gt;    OldSuspend := FSuspended;&lt;br /&gt;    try&lt;br /&gt;      FSuspended := True;&lt;br /&gt;      CheckThreadError(Integer(SuspendThread(FMainProcess.hThread)) &gt;= 0);&lt;br /&gt;    except&lt;br /&gt;      FSuspended := OldSuspend;&lt;br /&gt;      raise;&lt;br /&gt;    end;&lt;br /&gt;  end;&lt;br /&gt;  inherited Suspend;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;procedure TProcessThread.CallException;&lt;br /&gt;begin&lt;br /&gt;  if Assigned(FOnException) then&lt;br /&gt;    FOnException(Self, FException);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TProcessThread.CallProcessOpened;&lt;br /&gt;begin&lt;br /&gt;  if Assigned(FOnProcessStarted) then&lt;br /&gt;    FOnProcessStarted(Self);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TProcessThread.CallProcessTerminated;&lt;br /&gt;begin&lt;br /&gt;  if Assigned(FOnProcessTerminated) then&lt;br /&gt;    FOnProcessTerminated(Self);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;constructor TProcessThread.Create(Path, CommandLine, Directory: string; Environment: TStrings; Watch: Boolean);&lt;br /&gt;var&lt;br /&gt;  Len, I: Integer;&lt;br /&gt;begin&lt;br /&gt;  inherited Create(True);&lt;br /&gt;&lt;br /&gt;  if (Length(CommandLine) &gt; 0) and (Length(Path) &gt; 0) then&lt;br /&gt;    CommandLine := ' ' + CommandLine;&lt;br /&gt;&lt;br /&gt;  if Length(Path) &gt; 0 then&lt;br /&gt;  begin&lt;br /&gt;    GetMem(FPath, Length(Path) + 1);&lt;br /&gt;    StrCopy(FPath, PChar(Path));&lt;br /&gt;  end;&lt;br /&gt;  if Length(CommandLine) &gt; 0 then&lt;br /&gt;  begin&lt;br /&gt;    GetMem(FCommandLine, Length(CommandLine) + 1);&lt;br /&gt;    StrCopy(FCommandLine, PChar(CommandLine));&lt;br /&gt;  end;&lt;br /&gt;&lt;br /&gt;  if Length(Directory) &gt; 0 then&lt;br /&gt;  begin&lt;br /&gt;    GetMem(FDirectory, Length(Directory) + 1);&lt;br /&gt;    StrCopy(FDirectory, PChar(Directory));&lt;br /&gt;  end;&lt;br /&gt;&lt;br /&gt;  FWatching := Watch;&lt;br /&gt;&lt;br /&gt;  if Assigned(Environment) then&lt;br /&gt;  begin&lt;br /&gt;    GetMem(FEnvironment, 1);&lt;br /&gt;    Len := 1;&lt;br /&gt;    for I := 0 to Environment.Count - 1 do&lt;br /&gt;    begin&lt;br /&gt;      Inc(Len, Length(Environment[I]) + 1);&lt;br /&gt;      ReallocMem(FEnvironment, Len);&lt;br /&gt;      SetEnvironmentVariable(PChar(Environment.Names[I]), PChar(Environment.ValueFromIndex[I]));&lt;br /&gt;      StrCopy(FEnvironment + Len - Length(Environment[I]) - 2, PChar(Environment[I]));&lt;br /&gt;    end;&lt;br /&gt;    (FEnvironment + Len - 1)^ := #0;&lt;br /&gt;    FreeMem(FEnvironment);&lt;br /&gt;    FEnvironment := nil;&lt;br /&gt;  end;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;destructor TProcessThread.Destroy;&lt;br /&gt;begin&lt;br /&gt;  FreeMem(FPath);&lt;br /&gt;  FreeMem(FCommandLine);&lt;br /&gt;  FreeMem(FDirectory);&lt;br /&gt;  FreeResources;&lt;br /&gt;  if Assigned(FEnvironment) then&lt;br /&gt;    FreeMem(FEnvironment);&lt;br /&gt;  inherited;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TProcessThread.Execute;&lt;br /&gt;const&lt;br /&gt;  MAX_BUFFER = 512 * 1024;&lt;br /&gt;var&lt;br /&gt;  MaxBytes, Available, BytesRead: Cardinal;&lt;br /&gt;  Buffer: array[0..MAX_BUFFER] of Char;&lt;br /&gt;&lt;br /&gt;  function Read: Boolean;&lt;br /&gt;  begin&lt;br /&gt;    Result := True;&lt;br /&gt;    FillChar(Buffer, MAX_BUFFER, #0);&lt;br /&gt;    PeekNamedPipe(OutputRead, @Buffer, MAX_BUFFER, @BytesRead, @Available, nil);&lt;br /&gt;&lt;br /&gt;    if BytesRead &lt; MAX_BUFFER then&lt;br /&gt;    begin&lt;br /&gt;      MaxBytes := BytesRead;&lt;br /&gt;    end&lt;br /&gt;    else&lt;br /&gt;      MaxBytes := MAX_BUFFER;&lt;br /&gt;&lt;br /&gt;    if MaxBytes &gt; 0 then&lt;br /&gt;      if ReadFile(OutputRead, Buffer, MaxBytes, BytesRead, nil) then&lt;br /&gt;      begin&lt;br /&gt;        if BytesRead &gt; 0 then&lt;br /&gt;        begin&lt;br /&gt;          FData := StrPas(Buffer);&lt;br /&gt;          Synchronize(CallDataAvailable);&lt;br /&gt;        end;&lt;br /&gt;      end&lt;br /&gt;      else&lt;br /&gt;        Result := False;&lt;br /&gt;  end;&lt;br /&gt;&lt;br /&gt;var&lt;br /&gt;  Startup: STARTUPINFO;&lt;br /&gt;  SecurityDescriptor: SECURITY_DESCRIPTOR;&lt;br /&gt;  SecurityAttributes: SECURITY_ATTRIBUTES;&lt;br /&gt;begin&lt;br /&gt;  try&lt;br /&gt;    ZeroMemory(@Startup, SizeOf(STARTUPINFO));&lt;br /&gt;    Startup.cb := SizeOf(STARTUPINFO);&lt;br /&gt;    ZeroMemory(@SecurityDescriptor, SizeOf(SECURITY_DESCRIPTOR));&lt;br /&gt;    ZeroMemory(@SecurityAttributes, SizeOf(SECURITY_ATTRIBUTES));&lt;br /&gt;    InputRead := 0;&lt;br /&gt;    InputWrite := 0;&lt;br /&gt;    OutputRead := 0;&lt;br /&gt;    OutputWrite := 0;&lt;br /&gt;&lt;br /&gt;    if Win32Platform = VER_PLATFORM_WIN32_NT then&lt;br /&gt;    begin&lt;br /&gt;      InitializeSecurityDescriptor(@SecurityDescriptor, SECURITY_DESCRIPTOR_REVISION);&lt;br /&gt;      SetSecurityDescriptorDacl(@SecurityDescriptor, True, nil, False);&lt;br /&gt;      SecurityAttributes.lpSecurityDescriptor := @SecurityDescriptor;&lt;br /&gt;    end&lt;br /&gt;    else&lt;br /&gt;      SecurityAttributes.lpSecurityDescriptor := nil;&lt;br /&gt;    SecurityAttributes.nLength := SizeOf(SECURITY_ATTRIBUTES);&lt;br /&gt;    SecurityAttributes.bInheritHandle := True;&lt;br /&gt;    if not CreatePipe(OutputRead, OutputWrite, @SecurityAttributes, 0)&lt;br /&gt;    or not CreatePipe(InputRead, InputWrite, @SecurityAttributes, 0) then&lt;br /&gt;      raise EProcessError.Create('Error while opening pipes');&lt;br /&gt;&lt;br /&gt;    SetHandleInformation(OutputRead, HANDLE_FLAG_INHERIT, 0);&lt;br /&gt;    SetHandleInformation(InputWrite, HANDLE_FLAG_INHERIT, 0);&lt;br /&gt;&lt;br /&gt;    GetStartupInfo(Startup);&lt;br /&gt;    Startup.dwFlags := STARTF_USESHOWWINDOW OR STARTF_USESTDHANDLES;&lt;br /&gt;&lt;br /&gt;    Startup.hStdOutput := OutputWrite;&lt;br /&gt;    Startup.hStdError := OutputWrite;&lt;br /&gt;    Startup.hStdInput := InputRead;&lt;br /&gt;&lt;br /&gt;    FlushFileBuffers(OutputWrite);&lt;br /&gt;    FlushFileBuffers(OutputRead);&lt;br /&gt;    FlushFileBuffers(InputRead);&lt;br /&gt;    FlushFileBuffers(InputWrite);&lt;br /&gt;&lt;br /&gt;    Startup.wShowWindow := SW_HIDE;&lt;br /&gt;&lt;br /&gt;    if not CreateProcess(FPath, FCommandLine, nil, nil, True, CREATE_NEW_CONSOLE OR NORMAL_PRIORITY_CLASS, FEnvironment, FDirectory, Startup, FMainProcess) then&lt;br /&gt;      raise EProcessError.Create('Error while starting Process: ' + SysErrorMessage(GetLastError) + ':' + FPath + ':' + FCommandLine + ':' + FDirectory);&lt;br /&gt;    WaitForInputIdle(FMainProcess.hProcess, INITIALIZATION_TIMEOUT);&lt;br /&gt;    FStarted := True;&lt;br /&gt;    SetPriority(GetPriority);&lt;br /&gt;    Synchronize(CallProcessOpened);&lt;br /&gt;    &lt;br /&gt;    if not FWatching then&lt;br /&gt;      Exit;&lt;br /&gt;&lt;br /&gt;    repeat&lt;br /&gt;      if not Read then&lt;br /&gt;        Break;&lt;br /&gt;    until not IsProcessAlive or Terminated;&lt;br /&gt;    Read;&lt;br /&gt;&lt;br /&gt;    if not IsProcessAlive then&lt;br /&gt;      Synchronize(CallProcessTerminated);&lt;br /&gt;      &lt;br /&gt;  except&lt;br /&gt;    on E: Exception do&lt;br /&gt;    begin&lt;br /&gt;      FException := E;&lt;br /&gt;      Synchronize(CallException);&lt;br /&gt;    end;&lt;br /&gt;  end;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TProcessThread.FreeResources;&lt;br /&gt;begin&lt;br /&gt;  KillProcess(FMainProcess.dwProcessId);&lt;br /&gt;&lt;br /&gt;  if OutputRead &lt;&gt; 0 then&lt;br /&gt;  begin&lt;br /&gt;    CloseHandle(OutputRead);&lt;br /&gt;    OutputRead := 0;&lt;br /&gt;  end;&lt;br /&gt;  if OutputWrite &lt;&gt; 0 then&lt;br /&gt;  begin&lt;br /&gt;    CloseHandle(OutputWrite);&lt;br /&gt;    OutputWrite := 0;&lt;br /&gt;  end;&lt;br /&gt;  if InputWrite &lt;&gt; 0 then&lt;br /&gt;  begin&lt;br /&gt;    CloseHandle(InputWrite);&lt;br /&gt;    InputWrite := 0;&lt;br /&gt;  end;&lt;br /&gt;  if InputRead &lt;&gt; 0 then&lt;br /&gt;  begin&lt;br /&gt;    CloseHandle(InputRead);&lt;br /&gt;    InputRead := 0;&lt;br /&gt;  end;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;{  TProcessLineThread }&lt;br /&gt;&lt;br /&gt;constructor  TProcessLineThread.Create(Path, CommandLine, Directory: string; Environment: TStrings);&lt;br /&gt;begin&lt;br /&gt;  inherited Create(Path, CommandLine, Directory, Environment);&lt;br /&gt;  OnDataAvailable := DataAvailable;&lt;br /&gt;  OnTerminate := Finished;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure  TProcessLineThread.DataAvailable(Sender: TObject);&lt;br /&gt;var&lt;br /&gt;  I, L: Integer;&lt;br /&gt;begin&lt;br /&gt;  I := 0;&lt;br /&gt;  L := Length(Data);&lt;br /&gt;  while I &lt; L do&lt;br /&gt;  begin&lt;br /&gt;    Inc(I);&lt;br /&gt;    if Data[I] in [#13, #10] then&lt;br /&gt;    begin&lt;br /&gt;      if (I &lt; L) and (Data[I+1] in [#13, #10]) then&lt;br /&gt;        Inc(I);&lt;br /&gt;      if Assigned(FOnNewLine) then&lt;br /&gt;        FOnNewLine(Self, FCurrentLine);&lt;br /&gt;      FCurrentLine := '';&lt;br /&gt;    end&lt;br /&gt;    else&lt;br /&gt;      FCurrentLine := FCurrentLine + Data[I];&lt;br /&gt;  end;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure  TProcessLineThread.Finished(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;  if (FCurrentLine &lt;&gt; '') and Assigned(FOnNewLine) then&lt;br /&gt;    FOnNewLine(Self, FCurrentLine);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;end.&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Mon, 07 Jul 2008 07:25:12 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/5729</guid>
      <author>jonasraoni (Jonas Raoni Soares Silva)</author>
    </item>
    <item>
      <title>Interactive Text-to-Speech (Windows, Perl)</title>
      <link>http://snippets.dzone.com/posts/show/5047</link>
      <description>This script calls the Windows OLE for the built in TTS. Type what you want the computer to say at the prompt and hit enter. To quit type ":q" (minus the quotation marks).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;use Win32::OLE qw( EVENTS );&lt;br /&gt;&lt;br /&gt;get_text();&lt;br /&gt;&lt;br /&gt;sub get_text{&lt;br /&gt;	$output_speech = &lt;STDIN&gt;;&lt;br /&gt;	chomp($output_speech);&lt;br /&gt;	if($output_speech ne ":q"){&lt;br /&gt;		say_this();&lt;br /&gt;		get_text();&lt;br /&gt;	}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;sub say_this{&lt;br /&gt;	my $myTTS = new Win32::OLE( "Sapi.SpVoice" ); &lt;br /&gt;	$myTTS-&gt;Speak( "$output_speech" );&lt;br /&gt;	while( $myTTS-&gt;{Speaking} )&lt;br /&gt;	{&lt;br /&gt;		Win32::OLE-&gt;SpinMessageLoop();&lt;br /&gt;		Win32::Sleep( 100 );&lt;br /&gt;	}&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Mon, 28 Jan 2008 19:59:29 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/5047</guid>
      <author>minitotoro (Natalie)</author>
    </item>
    <item>
      <title>Find &amp; Replace in Word Document with Ruby</title>
      <link>http://snippets.dzone.com/posts/show/4747</link>
      <description>I use this to open a "template" (really just a plain Word document with [text to replace] inside), do the substitutions, and save as a new filename.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;require 'win32ole'&lt;br /&gt;&lt;br /&gt;word = WIN32OLE.new('Word.Application')&lt;br /&gt;#word.Visible = true # uncomment if you want to see it happen&lt;br /&gt;doc = word.Documents.Open('c:\file_to_open.doc')&lt;br /&gt;{&lt;br /&gt;  'name' =&gt; 'Tim Morgan',&lt;br /&gt;  'date' =&gt; Date.today.strftime('%B %d, %Y'),&lt;br /&gt;  ...&lt;br /&gt;}.each do |key, value|&lt;br /&gt;  word.Selection.HomeKey(unit=6) # start at beginning&lt;br /&gt;  find = word.Selection.Find&lt;br /&gt;  find.Text = "[#{key}]" # text must be in square brackets&lt;br /&gt;  while word.Selection.Find.Execute&lt;br /&gt;    word.Selection.TypeText(text=value)&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;doc.SaveAs('c:\output_file.doc')&lt;br /&gt;doc.Close&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Mon, 12 Nov 2007 14:48:47 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/4747</guid>
      <author>timmorgan (Tim Morgan)</author>
    </item>
    <item>
      <title>Internet Explorer automation using win32::OLE</title>
      <link>http://snippets.dzone.com/posts/show/4586</link>
      <description>// Sample code used for one of my client&lt;br /&gt;&lt;code&gt;&lt;br /&gt;#!/usr/bin/perl -w&lt;br /&gt;&lt;br /&gt;use strict;&lt;br /&gt;use Data::Dumper;&lt;br /&gt;use Win32::OLE qw( EVENTS );&lt;br /&gt;&lt;br /&gt;my ($day, $mon, $year, $hour, $min, $sec) = (localtime)[3, 4, 5, 2, 1, 0];&lt;br /&gt;$mon++; # 0-based index&lt;br /&gt;$year = $year + 1900;&lt;br /&gt;my $date = sprintf ("%04i-%02i-%02i %02i\:%02i\:%02i", $year, $mon, $day, $hour, $min, $sec);&lt;br /&gt;&lt;br /&gt;my $Disconnect;&lt;br /&gt;my $Menu;&lt;br /&gt;my $TreeView;&lt;br /&gt;my $WatchDog;&lt;br /&gt;my $MenuClicked=0;&lt;br /&gt;&lt;br /&gt;my $ScenarioCompleted=0;&lt;br /&gt;&lt;br /&gt;my @TreeViewLinks=("Appareillage du B","Branchement Comptage","Branchement individuel");&lt;br /&gt;my $Previouslink=$TreeViewLinks[0];&lt;br /&gt;&lt;br /&gt;my $ie = Win32::OLE-&gt;new( 'InternetExplorer.Application' ) or die "error starting IE";&lt;br /&gt;$ie-&gt;{visible} = 1;&lt;br /&gt;&lt;br /&gt;Win32::OLE-&gt;Option( Warn =&gt; 3 );&lt;br /&gt;&lt;br /&gt;$WatchDog=time();&lt;br /&gt;Win32::OLE-&gt;WithEvents( $ie, \&amp;Event, 'DWebBrowserEvents2' );&lt;br /&gt;$ie-&gt;navigate( 'http://www.xxx.fr' );&lt;br /&gt;Win32::OLE-&gt;MessageLoop();&lt;br /&gt;unlink("noemis.err") if -f "noemis.err";&lt;br /&gt;if ( ! $ScenarioCompleted ) {&lt;br /&gt;	open( ERR , "&gt;noemis.err" ); &lt;br /&gt;	print ERR "Problem executing Noemis scenario, please check www.xxx.fr.\n" ;&lt;br /&gt;	close(ERR);&lt;br /&gt;}&lt;br /&gt;$Disconnect-&gt;Click();&lt;br /&gt;Win32::OLE-&gt;SpinMessageLoop;&lt;br /&gt;&lt;br /&gt;# Maintenance du fichier historique&lt;br /&gt;open ( STATS , "noemis.txt" );&lt;br /&gt;my @lines=&lt;STATS&gt;;&lt;br /&gt;close (STATS);&lt;br /&gt;open( STATS , "&gt;noemis.txt" ); &lt;br /&gt;for my $line (@lines) {&lt;br /&gt;	my ($datetime) = split ( /;/ , $line );&lt;br /&gt;	my ($h_year,$h_mon) = $datetime =~ /^([0-9]{4})-([0-9]{2})/;&lt;br /&gt;	print STATS $line if ($year*12+$mon) - ($h_year*12+$h_mon) &lt; 2;&lt;br /&gt;}&lt;br /&gt;print STATS join(";",$date,"Noemis Scenario",( time() - $WatchDog ))."\n";&lt;br /&gt;close( STATS );&lt;br /&gt;&lt;br /&gt;sleep 2;&lt;br /&gt;Win32::OLE-&gt;SpinMessageLoop;&lt;br /&gt;sleep 1;&lt;br /&gt;$ie-&gt;Quit();&lt;br /&gt;exit 0;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;sub Event {&lt;br /&gt;	my ($Obj,$Event,@Args) = @_;&lt;br /&gt;	my $IEObject = shift @Args;&lt;br /&gt;	print " Event triggered: $Event\n";    &lt;br /&gt;&lt;br /&gt;	my ($i,$anchor);&lt;br /&gt;	my $anchors;&lt;br /&gt;    &lt;br /&gt;	# STEP 1 : Find the main menu, login to the web site, find the treeview&lt;br /&gt;	if ($Event eq "DocumentComplete") {    &lt;br /&gt;		print "URL: " . $IEObject-&gt;Document-&gt;URL . "\n";&lt;br /&gt;		if ( $IEObject-&gt;Document-&gt;URL eq "http://www.xxx.fr/ident.aspx" ) {&lt;br /&gt;			my $forms = $IEObject-&gt;Document-&gt;forms;&lt;br /&gt;			my $form = $forms-&gt;item(0);&lt;br /&gt;			if ( defined($form-&gt;elements("fldNumCli")) ) {&lt;br /&gt;				print "--------------------------------------------\n";&lt;br /&gt;				print "Found the login box, authenticating ...\n";&lt;br /&gt;				print "--------------------------------------------\n";&lt;br /&gt;			    $form-&gt;elements("fldNumCli")-&gt;{value} = "xxxx";&lt;br /&gt;			    $form-&gt;elements("fldUtil")-&gt;{value} = "xxx";&lt;br /&gt;			    $form-&gt;elements("fldPwd")-&gt;{value} = "xxx";&lt;br /&gt;		    	$form-&gt;elements("btIdent")-&gt;Click();&lt;br /&gt;	    		}&lt;br /&gt;		}&lt;br /&gt;		if ( $IEObject-&gt;Document-&gt;URL eq "http://www.xxx.fr/menu.aspx" ) {&lt;br /&gt;			print "Found the menu.\n";&lt;br /&gt;			$Menu = $IEObject-&gt;Document;&lt;br /&gt;			$anchors = $IEObject-&gt;Document-&gt;links;&lt;br /&gt;			for (my $i=0; $i &lt; $anchors-&gt;length; $i++) {&lt;br /&gt;				$anchor = $anchors-&gt;item($i);&lt;br /&gt;				print $anchor-&gt;href."\n";&lt;br /&gt;				$Disconnect = $anchor if $anchor-&gt;href eq "http://www.xxx.fr/ident.aspx?qs=deconnecter";&lt;br /&gt;			}&lt;br /&gt;	      	}	    &lt;br /&gt;		if ( $IEObject-&gt;Document-&gt;URL eq "http://www.xxx.fr/client/frameTreeview.aspx" ) {&lt;br /&gt;			print "Found the TreeView.\n";&lt;br /&gt;			$TreeView = $IEObject-&gt;Document;&lt;br /&gt;      		}		&lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt;	# STEP 2 : Click on the Menu and TreeView links   &lt;br /&gt;	if ($Event eq "DocumentComplete") {    		&lt;br /&gt;	if ( ! $MenuClicked and defined($Menu) ) {&lt;br /&gt;		my $MenuItem = $Menu-&gt;getElementById("SM_CLIE_RECH");&lt;br /&gt;		if ( defined($MenuItem) ) { &lt;br /&gt;			print $MenuItem-&gt;ID."\n";&lt;br /&gt;			$MenuItem-&gt;Click;&lt;br /&gt;			$MenuClicked = 1;&lt;br /&gt;		}&lt;br /&gt;	}}&lt;br /&gt;&lt;br /&gt;	if ( $Event eq "CommandStateChange" or $Event eq "StatusTextChange" ) {&lt;br /&gt;		print Dumper($IEObject);&lt;br /&gt;	}&lt;br /&gt;	if ( @TreeViewLinks != 0 and &lt;br /&gt;	     defined($TreeView) and &lt;br /&gt;	     $Event eq "DocumentComplete" &lt;br /&gt;	) {&lt;br /&gt;		my $link = shift(@TreeViewLinks);&lt;br /&gt;		$anchors = $TreeView-&gt;links;&lt;br /&gt;		my $found=0;&lt;br /&gt;		print "Looking for '$link' in the TreeView ... \n";&lt;br /&gt;	        for (my $i=0; $i &lt; $anchors-&gt;length; $i++) {&lt;br /&gt;		       	$anchor = $anchors-&gt;item($i);&lt;br /&gt;	        	#print $anchor-&gt;innerHTML."\n";&lt;br /&gt;		       	if ( $anchor-&gt;innerHTML =~ /$link/ ) {&lt;br /&gt;				print "Clicking on '$link' ... \n";&lt;br /&gt;	                	$anchor-&gt;Click;&lt;br /&gt;				$found=1;&lt;br /&gt;				$Previouslink=$link;&lt;br /&gt;				last;&lt;br /&gt;			}&lt;br /&gt;	        }&lt;br /&gt;		if ( ! $found ) { &lt;br /&gt;			# Le TreeView a bugge, on reclique&lt;br /&gt;			sleep 1;&lt;br /&gt;			print "Looking for '$Previouslink' in the TreeView ... \n";&lt;br /&gt;		        for (my $i=0; $i &lt; $anchors-&gt;length; $i++) {&lt;br /&gt;			       	$anchor = $anchors-&gt;item($i);&lt;br /&gt;	        		#print $anchor-&gt;innerHTML."\n";&lt;br /&gt;		       		if ( $anchor-&gt;innerHTML =~ /$Previouslink/ ) {&lt;br /&gt;					print "Clicking on '$Previouslink' ... \n";&lt;br /&gt;	              		  	$anchor-&gt;Click;&lt;br /&gt;					last;&lt;br /&gt;				}&lt;br /&gt;		        }&lt;br /&gt;			unshift @TreeViewLinks,$link;&lt;br /&gt;		}&lt;br /&gt;	} &lt;br /&gt;   &lt;br /&gt;	# STEP 3 : Verify the list displayed &lt;br /&gt;		&lt;br /&gt;	if ($Event eq "DocumentComplete") {    &lt;br /&gt;   		if ( @TreeViewLinks == 0 and $IEObject-&gt;Document-&gt;URL =~ /listeRefPlof.aspx/ ) {&lt;br /&gt;			print "Scenario completed, exiting ...\n";&lt;br /&gt;			$ScenarioCompleted=1;&lt;br /&gt;	   		Win32::OLE-&gt;QuitMessageLoop;&lt;br /&gt;		}&lt;br /&gt;	}&lt;br /&gt;    &lt;br /&gt;&lt;br /&gt;	# Exit on errors&lt;br /&gt;	    &lt;br /&gt;	Win32::OLE-&gt;QuitMessageLoop() if $Event eq "OnQuit" or time() &gt; $WatchDog + 60;&lt;br /&gt;    &lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Fri, 28 Sep 2007 11:45:24 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/4586</guid>
      <author>bouffon69 (Sylvain Le Courtois)</author>
    </item>
    <item>
      <title>ASP Page listing and making changes to AD accounts</title>
      <link>http://snippets.dzone.com/posts/show/4560</link>
      <description>// Used for automated AD account migration&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;HTML&gt;&lt;HEAD&gt;&lt;TITLE&gt;Workstation User Account migration&lt;/TITLE&gt;&lt;br /&gt;&lt;META http-equiv=Content-Type content="text/html; charset=iso-8859-1"&gt;&lt;LINK &lt;br /&gt;href="files/v2006.css" type=text/css rel=stylesheet&gt;&lt;br /&gt;&lt;BODY leftMargin=0 topMargin=30 marginwidth="0" marginheight="0"&gt;&lt;br /&gt;&lt;CENTER&gt;&lt;br /&gt;&lt;%&lt;br /&gt;' ------------------------------------------------------------------------&lt;br /&gt;Const ADS_PROPERTY_CLEAR = 1&lt;br /&gt;&lt;br /&gt;Const SOURCE_OU="ou=NT Users,ou=NT,dc=fr,dc=erm,dc=int"&lt;br /&gt;Const TARGET_OU="ou=SUPPORT SERVICES,dc=fr,dc=erm,dc=int"&lt;br /&gt;&lt;br /&gt;Const HOMES_PATH="\\frsrvfil0001\USERS\"&lt;br /&gt;Const PROFILES_PATH="\\frsrvfil0001\PROFILES\"&lt;br /&gt;&lt;br /&gt;Const ADMIN_HOMES_PATH_SOURCE="\\frsrvfil0001\U$\NT\"&lt;br /&gt;Const ADMIN_PROFILES_PATH_SOURCE="\\frsrvfil0001\P$\NT\"&lt;br /&gt;Const ADMIN_HOMES_PATH_DEST="\\frsrvfil0001\U$\"&lt;br /&gt;Const ADMIN_PROFILES_PATH_DEST="\\frsrvfil0001\P$\"&lt;br /&gt;&lt;br /&gt;Const SCRIPT_NAME="ntuser_to_xp.asp"&lt;br /&gt;&lt;br /&gt;Dim State&lt;br /&gt;State="Init"&lt;br /&gt;Dim OU, Member&lt;br /&gt; &lt;br /&gt;If Request.QueryString("login") &lt;&gt; "" Then&lt;br /&gt;		' Affichage formulaire pour modif du compte&lt;br /&gt;		State="Info"&lt;br /&gt;End If&lt;br /&gt;If Request.Form("login") &lt;&gt; "" Then&lt;br /&gt;		' On a cliqu&#233; sur OK pour valider le formulaire&lt;br /&gt;		State="Modify"&lt;br /&gt;End If&lt;br /&gt;' ------------------------------------------------------------------------&lt;br /&gt;%&gt;&lt;br /&gt;&lt;TABLE cellSpacing=0 cellPadding=1 width=500 align=center bgColor=#26333e &lt;br /&gt;border=0&gt;&lt;br /&gt;  &lt;TBODY&gt;&lt;br /&gt;  &lt;TR&gt;&lt;br /&gt;    &lt;TD&gt;&lt;br /&gt;      &lt;TABLE cellSpacing=0 cellPadding=1 width=500 align=center border=0&gt;&lt;br /&gt;        &lt;TBODY&gt;&lt;br /&gt;        &lt;TR bgColor=#f0f3f5&gt;&lt;br /&gt;          &lt;TD width=160 valign="top"&gt;&lt;IMG height=116 src="files/man_portable.jpg" &lt;br /&gt;            width=160&gt; &lt;/TD&gt;&lt;br /&gt;          &lt;TD width=302 bgColor=#e5ebef&gt;&lt;br /&gt;&lt;br /&gt;&lt;%&lt;br /&gt;	If State="Init" Then&lt;br /&gt;	'-----------------------------------------------------------------------------------&lt;br /&gt;	' Listing of the NT Users&lt;br /&gt;	'-----------------------------------------------------------------------------------&lt;br /&gt;%&gt;          &lt;br /&gt;&lt;br /&gt;            &lt;TABLE cellSpacing=4 cellPadding=4 width="100%" align=center &lt;br /&gt;            border=0&gt;&lt;br /&gt;              &lt;TBODY&gt;&lt;br /&gt;              &lt;TR&gt;&lt;br /&gt;                &lt;TD class=medium colSpan=3 height=22&gt;&lt;br /&gt;                    &lt;%&lt;br /&gt;                    'Response.Write(SOURCE_OU &amp; "&lt;BR&gt;") &lt;br /&gt;                    %&gt;&lt;br /&gt;					Please select the NT 4.0 Workstation user account to migrate&lt;br /&gt;                &lt;/TD&gt;&lt;/TR&gt;&lt;br /&gt;                &lt;br /&gt;              &lt;TR&gt;&lt;br /&gt;                &lt;TD class=td11 height=22&gt;&lt;br /&gt;                                  &lt;%&lt;br /&gt;                  Set OU = GetObject("LDAP://" &amp; SOURCE_OU)&lt;br /&gt;                  OU.Filter = Array("user")&lt;br /&gt;    	          For Each Member In OU&lt;br /&gt;    	          		' Bug with the SMS Account ??&lt;br /&gt;    	          		If Member.Name &lt;&gt; "CN=SMSService" Then &lt;br /&gt;    	          		If Member.AccountDisabled = 0 Then&lt;br /&gt;	    	                Response.Write("&lt;A HREF=""" &amp; SCRIPT_NAME &amp; "?login=" &amp; Server.URLEncode(Member.Name) &amp; """&gt;" &amp; Member.FullName &amp; "&lt;/A&gt;&lt;BR&gt;")&lt;br /&gt;	    	            End If&lt;br /&gt;	    	            End If &lt;br /&gt;            	  Next      &lt;br /&gt;                  &lt;br /&gt;                  %&gt;&lt;br /&gt;&lt;br /&gt;                &lt;/TD&gt;&lt;br /&gt;                &lt;/TR&gt;&lt;br /&gt;                &lt;br /&gt;                &lt;/TBODY&gt;&lt;/TABLE&gt;&lt;br /&gt;&lt;br /&gt;&lt;%&lt;br /&gt;End If&lt;br /&gt;%&gt;                &lt;br /&gt;                &lt;br /&gt;&lt;%&lt;br /&gt;	If State="Info" Then&lt;br /&gt;	'-----------------------------------------------------------------------------------&lt;br /&gt;	' Information page about the NT Users&lt;br /&gt;	'-----------------------------------------------------------------------------------&lt;br /&gt;%&gt;          &lt;br /&gt;			&lt;FORM method=post&gt;&lt;br /&gt;&lt;br /&gt;            &lt;TABLE cellSpacing=4 cellPadding=4 width="100%" align=center &lt;br /&gt;            border=0&gt;&lt;br /&gt;              &lt;TBODY&gt;&lt;br /&gt;              &lt;TR&gt;&lt;br /&gt;                &lt;TD class=medium colSpan=2 height=22&gt;&lt;br /&gt;                 	&lt;%&lt;br /&gt;                 	Response.Write("Windows NT 4.0 User Account Migration")&lt;br /&gt;                    %&gt;&lt;br /&gt;					&lt;br /&gt;                &lt;/TD&gt;&lt;/TR&gt;&lt;br /&gt;               &lt;br /&gt;                  &lt;%&lt;br /&gt;                  Sub TabRow(v1,v2)&lt;br /&gt;                  		Response.Write("&lt;TR class=td11 height=16&gt;&lt;TD&gt;&lt;B&gt;" &amp; v1 &amp; "&lt;/B&gt;")&lt;br /&gt;                  		Response.Write("&lt;TD&gt;" &amp; v2 &amp; "&lt;/TD&gt;")&lt;br /&gt;                  		Response.Write("&lt;/TD&gt;&lt;/TR&gt;")&lt;br /&gt;                  End Sub&lt;br /&gt;                  Set Member = GetObject("LDAP://" &amp; Request.QueryString("login") &amp; "," &amp; SOURCE_OU)&lt;br /&gt;&lt;br /&gt;                  TabRow "User Name",Member.FullName&lt;br /&gt;                  TabRow "NT Login",Member.sAMAccountName&lt;br /&gt;				  TabRow "Login Script", Member.LoginScript &amp; " (to delete)"&lt;br /&gt;				  TabRow "Profile Path", Member.Profile&lt;br /&gt;				  TabRow "New Path",PROFILES_PATH &amp; Member.sAMAccountName&lt;br /&gt;				  TabRow "Home Folder", Member.HomeDirectory&lt;br /&gt;				  TabRow "New Path",HOMES_PATH &amp; Member.sAMAccountName&lt;br /&gt;				  &lt;br /&gt;				  ' Liste des OU dans SUPPORT SERVICES&lt;br /&gt; 				  Dim OUSuppServices, Entity, BoxList&lt;br /&gt; 				  Set OUSuppServices=GetObject("LDAP://" &amp; TARGET_OU)&lt;br /&gt;				  OUSuppServices.Filter = Array("organizationalUnit")&lt;br /&gt;				  BoxList="&lt;SELECT NAME=""entity""&gt;"&lt;br /&gt;				  For Each Entity in OUSuppServices&lt;br /&gt;				  	BoxList= BoxList &amp; "&lt;OPTION VALUE=""" &amp; Entity.Name &amp; """&gt;" &amp; Mid(Entity.Name,4) &amp; "&lt;/OPTION&gt;"&lt;br /&gt;				  Next&lt;br /&gt;				  BoxList=BoxList &amp; "&lt;/SELECT&gt;"&lt;br /&gt;				  TabRow "Organizational Unit",BoxList&lt;br /&gt;                                    &lt;br /&gt;                  %&gt;&lt;br /&gt;&lt;br /&gt;                &lt;br /&gt;                &lt;/TBODY&gt;&lt;/TABLE&gt;&lt;br /&gt;                &lt;BR&gt;&lt;br /&gt;                &lt;INPUT name=login type=hidden value=&lt;% Response.Write(Member.sAMAccountName) %&gt; &gt;&lt;br /&gt;                &lt;INPUT type=image height=18 alt="GO !" width=15 src="files/submit.gif" value=login border=0 name=ok&gt;&lt;br /&gt;                &amp;nbspCliquer ici pour migrer ce compte.&lt;BR&gt;&lt;BR&gt;&lt;br /&gt;                ATTENTION, l'utilisateur ne doit pas &#234;tre connect&#233; ! &lt;br /&gt;                &lt;% Response.Write("&lt;BR&gt;&lt;BR&gt;&lt;A HREF=""" &amp; SCRIPT_NAME &amp; """&gt;" &amp; "Cliquer ICI pour annuler" &amp; "&lt;/A&gt;&lt;BR&gt;") %&gt;&lt;br /&gt;                &lt;/FORM&gt;&lt;br /&gt;&lt;br /&gt;&lt;%&lt;br /&gt;End If&lt;br /&gt;%&gt;                &lt;br /&gt;&lt;br /&gt;&lt;%&lt;br /&gt;&lt;br /&gt;	If State="Modify" Then&lt;br /&gt;	'-----------------------------------------------------------------------------------&lt;br /&gt;	' Migration of the NT Users&lt;br /&gt;	'-----------------------------------------------------------------------------------&lt;br /&gt;Sub dirMoveTree(source, dest)&lt;br /&gt;	Response.Write "Deplacement de &lt;B&gt;" &amp; source &amp; " vers " &amp; dest &amp; "&lt;/B&gt;&lt;BR&gt;"&lt;br /&gt;	Dim Folder,File,SubFolder&lt;br /&gt;	set Folder=fso.GetFolder(source)&lt;br /&gt;	For Each File In Folder.Files&lt;br /&gt;	      Response.Write File.Name &amp; " File -&gt; " &amp; dest &amp; "&lt;BR&gt;"&lt;br /&gt;	      file.move dest &amp; "\"&lt;br /&gt;	Next&lt;br /&gt;	For Each SubFolder In Folder.SubFolders&lt;br /&gt;	      Response.Write SubFolder.Name &amp; " Folder -&gt; " &amp; dest &amp; "&lt;BR&gt;"&lt;br /&gt;	      SubFolder.move dest &amp; "\"&lt;br /&gt;	Next&lt;br /&gt;End Sub&lt;br /&gt;&lt;br /&gt;%&gt;          &lt;br /&gt;&lt;CENTER&gt;&lt;br /&gt;Windows NT 4.0 User Account Migration&lt;BR&gt;&lt;BR&gt;&lt;br /&gt;&lt;%&lt;br /&gt;&lt;br /&gt;' Modification des proprietes l'utilisateur dans AD&lt;br /&gt;Set Member = GetObject("LDAP://" &amp; Request.QueryString("login") &amp; "," &amp; SOURCE_OU)&lt;br /&gt;&lt;br /&gt;' ADS_PROPERTY_CLEAR&lt;br /&gt;Member.PutEx 1, "scriptPath", 0&lt;br /&gt;Member.SetInfo&lt;br /&gt;&lt;br /&gt;Member.Put "profilePath", PROFILES_PATH &amp; Member.sAMAccountName&lt;br /&gt;Member.Put "homeDirectory", HOMES_PATH &amp; Member.sAMAccountName&lt;br /&gt;' &lt;br /&gt;Member.SetInfo&lt;br /&gt;' &lt;br /&gt;Response.Write("Utilisateur &lt;B&gt;" &amp; Member.sAMAccountName &amp; "&lt;/B&gt; Modifi&#233; dans AD&lt;BR&gt;&lt;BR&gt;")&lt;br /&gt;&lt;br /&gt;' Deplacement dans le bon conteneur&lt;br /&gt;Set OU = GetObject("LDAP://" &amp; "OU=Users," &amp; Request.Form("entity") &amp; "," &amp; TARGET_OU)&lt;br /&gt;OU.MoveHere "LDAP://" &amp; Request.QueryString("login") &amp; "," &amp; SOURCE_OU, Request.QueryString("login")&lt;br /&gt;Response.Write("Utilisateur &lt;B&gt;" &amp; "LDAP://" &amp; Request.QueryString("login") &amp; "," &amp; SOURCE_OU &amp; "&lt;/B&gt; Deplac&#233; dans " &amp; "LDAP://" &amp; "OU=Users," &amp; Request.Form("entity") &amp; "," &amp; TARGET_OU &amp; "&lt;BR&gt;&lt;BR&gt;")&lt;br /&gt;&lt;br /&gt;DIM fso, File, Folder, SubFolder&lt;br /&gt;Set fso = CreateObject("Scripting.FileSystemObject")&lt;br /&gt;&lt;br /&gt;' Creation des repertoires cible&lt;br /&gt;&lt;br /&gt;fso.CreateFolder(ADMIN_HOMES_PATH_DEST &amp; Request.Form("login"))&lt;br /&gt;fso.CreateFolder(ADMIN_PROFILES_PATH_DEST &amp; Request.Form("login"))&lt;br /&gt;&lt;br /&gt;' Deplacement des donn&#233;es&lt;br /&gt;&lt;br /&gt;dirMoveTree ADMIN_HOMES_PATH_SOURCE &amp; Request.Form("login"),ADMIN_HOMES_PATH_DEST &amp; Request.Form("login")&lt;br /&gt;dirMoveTree ADMIN_PROFILES_PATH_SOURCE &amp; Request.Form("login"),ADMIN_PROFILES_PATH_DEST &amp; Request.Form("login")&lt;br /&gt;&lt;br /&gt;' Applications des ACLs, en arriere plan car ca peut etre long !&lt;br /&gt;Response.Write("&lt;BR&gt;Creation du script d'application des ACLs C:\Inetpub\wwwroot\techcity\xcacls_" &amp; Request.Form("login") &amp; ".cmd&lt;BR&gt;&lt;BR&gt;")&lt;br /&gt;Set server_shell = Server.CreateObject("wscript.shell")&lt;br /&gt;&lt;br /&gt;server_shell.Run "cmd /c echo echo Excecution Cacls &gt;C:\Inetpub\wwwroot\techcity\xcacls_" &amp; Request.Form("login") &amp; ".cmd 2&gt;&amp;1",,1&lt;br /&gt;server_shell.Run "cmd /c echo xcacls.exe """ &amp; ADMIN_HOMES_PATH_DEST &amp; Request.Form("login") &amp; """ /T /C /G SYSTEM:F ADMINISTRATORS:F FR-ERM\" &amp; Request.Form("login") &amp; ":C /Y &gt;&gt;C:\Inetpub\wwwroot\techcity\xcacls_" &amp; Request.Form("login") &amp; ".cmd 2&gt;&amp;1",,1&lt;br /&gt;server_shell.Run "cmd /c echo xcacls.exe """ &amp; ADMIN_PROFILES_PATH_DEST &amp; Request.Form("login") &amp; """ /T /C /G SYSTEM:F ADMINISTRATORS:F FR-ERM\" &amp; Request.Form("login") &amp; ":F /Y &gt;&gt;C:\Inetpub\wwwroot\techcity\xcacls_" &amp; Request.Form("login") &amp; ".cmd 2&gt;&amp;1",,1&lt;br /&gt;&lt;br /&gt;' server_shell.Run "C:\Inetpub\wwwroot\techcity\xcacls.cmd &gt;C:\Inetpub\wwwroot\techcity\xcacls.log 2&gt;&amp;1",,1&lt;br /&gt;Response.Write("&lt;BR&gt;Les ACLs seront appliquee dans 5 min (scheduled)...&lt;BR&gt;&lt;BR&gt;")&lt;br /&gt;Response.Write("Attendre egalement la fin de replication de AD ...&lt;BR&gt;&lt;BR&gt;")&lt;br /&gt;&lt;br /&gt;Response.Write("&lt;BR&gt;Termin&#233; !&lt;BR&gt;")&lt;br /&gt;&lt;br /&gt;%&gt;&lt;br /&gt;&lt;% Response.Write("&lt;BR&gt;&lt;BR&gt;&lt;A HREF=""" &amp; SCRIPT_NAME &amp; """&gt;" &amp; "Cliquer ICI pour quitter" &amp; "&lt;/A&gt;&lt;BR&gt;") %&gt;&lt;br /&gt;&lt;/CENTER&gt;&lt;br /&gt;&lt;%&lt;br /&gt;End If&lt;br /&gt;%&gt;                &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;              &lt;/TD&gt;&lt;/TR&gt;            &lt;br /&gt;                &lt;br /&gt;                &lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;br /&gt;                        &lt;br /&gt;                &lt;br /&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/CENTER&gt;&lt;/BODY&gt;&lt;/HTML&gt;&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Thu, 20 Sep 2007 07:02:54 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/4560</guid>
      <author>bouffon69 (Sylvain Le Courtois)</author>
    </item>
    <item>
      <title>Simple ASP page to reset passwords</title>
      <link>http://snippets.dzone.com/posts/show/4559</link>
      <description>// This page allows to reset an AD account password.&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;HTML&gt;&lt;HEAD&gt;&lt;TITLE&gt;Reinitialisation de mot de passe&lt;/TITLE&gt;&lt;br /&gt;&lt;META http-equiv=Content-Type content="text/html; charset=iso-8859-1"&gt;&lt;LINK &lt;br /&gt;href="files/v2006.css" type=text/css rel=stylesheet&gt;&lt;br /&gt;&lt;BODY leftMargin=0 topMargin=30 marginwidth="0" marginheight="0"&gt;&lt;br /&gt;&lt;FORM method=post&gt;&lt;br /&gt;&lt;CENTER&gt;&lt;br /&gt;&lt;TABLE cellSpacing=0 cellPadding=1 width=500 align=center bgColor=#26333e &lt;br /&gt;border=0&gt;&lt;br /&gt;  &lt;TBODY&gt;&lt;br /&gt;  &lt;TR&gt;&lt;br /&gt;    &lt;TD&gt;&lt;br /&gt;      &lt;TABLE cellSpacing=0 cellPadding=1 width=500 align=center border=0&gt;&lt;br /&gt;        &lt;TBODY&gt;&lt;br /&gt;        &lt;TR bgColor=#f0f3f5&gt;&lt;br /&gt;          &lt;TD width=160&gt;&lt;IMG height=116 src="files/man_portable.jpg" &lt;br /&gt;            width=160&gt; &lt;/TD&gt;&lt;br /&gt;          &lt;TD width=302 bgColor=#e5ebef&gt;&lt;br /&gt;            &lt;TABLE cellSpacing=4 cellPadding=4 width="100%" align=center &lt;br /&gt;            border=0&gt;&lt;br /&gt;              &lt;TBODY&gt;&lt;br /&gt;              &lt;TR&gt;&lt;br /&gt;                &lt;TD class=medium colSpan=3 height=22&gt;&lt;br /&gt;                &lt;%&lt;br /&gt;                If Request.Form("login") = "" Then&lt;br /&gt;                	Response.Write("&lt;B&gt;Saisir le compte &#224; reinitialiser&lt;/B&gt;")&lt;br /&gt;                Else&lt;br /&gt;                    Dim Group, Member, Domain, UserFound&lt;br /&gt;                    ' &lt;br /&gt;                    Domain ="FR-ERM"&lt;br /&gt;                    '&lt;br /&gt;                    UserFound=0&lt;br /&gt;                    &lt;br /&gt;	                Set Group = GetObject("WinNT://" &amp; Domain &amp; "/Domain Users")&lt;br /&gt;    	            For Each Member In Group.Members&lt;br /&gt;    	            	' Response.Write(Member.Name &amp; "&lt;BR&gt;")&lt;br /&gt;        	        	If UCase(Member.Name) = UCase(Request.Form("login")) Then&lt;br /&gt;        	        		UserFound=1&lt;br /&gt;        	        		If Member.AccountDisabled Then &lt;br /&gt;        	        			Response.Write(" " &amp; Request.Form("login") &amp;" est un compte desactive&lt;/B&gt;")&lt;br /&gt;        	        			Exit For&lt;br /&gt;        	        		Else&lt;br /&gt;        	        			' Essai de reinit de mot de passe&lt;br /&gt;        	        			Dim res&lt;br /&gt;        	        			res=Member.SetPassword(Request.Form("pass"))&lt;br /&gt;        	        			'Member.Put "pwdLastSet", CLng(0)&lt;br /&gt;        	        			Member.Put "PasswordExpired", 1&lt;br /&gt;								Member.SetInfo&lt;br /&gt;        	        			Response.Write("&lt;B&gt;L'utilisateur "&amp; Request.Form("login") &amp; " a chang&#233; de mot de passe !&lt;BR&gt;&lt;BR&gt;&lt;/B&gt;Il devra changer de mot de passe au prochain login.")&lt;br /&gt;        	        			Exit For&lt;br /&gt;        	        		End If&lt;br /&gt;        	        	End If &lt;br /&gt;            	    Next      &lt;br /&gt;       	        	If UserFound = 0 Then&lt;br /&gt;       	        		Response.Write(Request.Form("login") &amp;" non trouv&#233; dans le domaine "&amp; Domain)&lt;br /&gt;       	        	End If           	            	&lt;br /&gt;                	&lt;br /&gt;                End If&lt;br /&gt;                %&gt;&lt;br /&gt;              &lt;br /&gt;                &lt;/TD&gt;&lt;/TR&gt;&lt;br /&gt;              &lt;TR&gt;&lt;br /&gt;                &lt;TD class=td11 width="1%" height=22&gt;Identifiant&lt;br /&gt;               &lt;br /&gt;                &lt;/TD&gt;&lt;br /&gt;                &lt;TD class=td11 colSpan=2&gt;Nouveau mot de passe&lt;/TD&gt;&lt;/TR&gt;&lt;br /&gt;              &lt;TR&gt;&lt;br /&gt;                &lt;TD width="25%"&gt;&lt;INPUT maxLength=20 name=login&gt;&lt;br /&gt; &lt;br /&gt;                &lt;/TD&gt;&lt;br /&gt;                &lt;TD width="20%"&gt;&lt;INPUT type=password maxLength=10 size=10 &lt;br /&gt;                  name=pass&gt; &lt;/TD&gt;&lt;br /&gt;                &lt;TD&gt;&lt;INPUT type=image height=18 alt="Reset !" width=15 &lt;br /&gt;                  src="files/submit.gif" value=login border=0 name=ok&gt; &lt;br /&gt;                &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/CENTER&gt;&lt;/FORM&gt;&lt;/BODY&gt;&lt;/HTML&gt;&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Thu, 20 Sep 2007 07:01:29 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/4559</guid>
      <author>bouffon69 (Sylvain Le Courtois)</author>
    </item>
    <item>
      <title>Automating Outlook with Ruby: Inbox &amp; Messages</title>
      <link>http://snippets.dzone.com/posts/show/4547</link>
      <description>From the &lt;a href="http://rubyonwindows.blogspot.com"&gt;Ruby on Windows&lt;/a&gt; blog.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;require 'win32ole'&lt;br /&gt;outlook = WIN32OLE.new('Outlook.Application')&lt;br /&gt;mapi = outlook.GetNameSpace('MAPI')&lt;br /&gt;&lt;br /&gt;# Get a reference to the Inbox or other folder:&lt;br /&gt;inbox = mapi.GetDefaultFolder(6)&lt;br /&gt;personal_folders = mapi.Folders.Item('Personal Folders')&lt;br /&gt;baseball_folder = personal_folders.Folders.Item('Baseball')&lt;br /&gt;&lt;br /&gt;# Get a count of a folder's unread items:&lt;br /&gt;puts "#{inbox.UnreadItemCount} unread messages"&lt;br /&gt;&lt;br /&gt;# Iterate over messages in a folder:&lt;br /&gt;inbox.Items.each do |message|&lt;br /&gt;    # Your code here...&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;# Retrieve a single message:&lt;br /&gt;first_message = inbox.Items(1)&lt;br /&gt;&lt;br /&gt;# Delete a message:&lt;br /&gt;message.Delete&lt;br /&gt;&lt;br /&gt;# Move a message to another folder:&lt;br /&gt;baseball_folder = personal_folders.Folders.Item('Baseball')&lt;br /&gt;message.Move(baseball_folder)&lt;br /&gt;&lt;br /&gt;inbox.Items.Count.downto(1) do |i|&lt;br /&gt;    message = inbox.Items(i)&lt;br /&gt;    if message.Subject =~ /cardinals/i&lt;br /&gt;        message.Move(baseball_folder)&lt;br /&gt;    end&lt;br /&gt;end&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Further details and discussion can be found &lt;a href="http://rubyonwindows.blogspot.com/2007/08/automating-outlook-with-ruby-inbox.html"&gt;here&lt;/a&gt;.&lt;br /&gt;</description>
      <pubDate>Sat, 15 Sep 2007 12:32:37 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/4547</guid>
      <author>dmullet (David Mullet)</author>
    </item>
    <item>
      <title>Open/Creates a Base Key in the Registry</title>
      <link>http://snippets.dzone.com/posts/show/4524</link>
      <description>// open a Base Key in the registry&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;       public static RegistryKey GetKey(string baseKey)&lt;br /&gt;        {&lt;br /&gt;            RegistryKey key;&lt;br /&gt;            try&lt;br /&gt;            {&lt;br /&gt;                key = Registry.LocalMachine.OpenSubKey(baseKey, true);&lt;br /&gt;&lt;br /&gt;                if (key == null)&lt;br /&gt;                {&lt;br /&gt;                    key = Registry.LocalMachine.CreateSubKey(baseKey);&lt;br /&gt;                }&lt;br /&gt;                else&lt;br /&gt;                {&lt;br /&gt;                    MessageBox.Show("Base key resolved");&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;            catch (Exception e)&lt;br /&gt;            {&lt;br /&gt;                return null;&lt;br /&gt;            }&lt;br /&gt;            return key;&lt;br /&gt;        }&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Tue, 11 Sep 2007 11:58:28 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/4524</guid>
      <author>dubby (Dave)</author>
    </item>
    <item>
      <title>MSSQL 2005 - Add ID value to ID column when INSERTING </title>
      <link>http://snippets.dzone.com/posts/show/4521</link>
      <description>// @TableName is obviously the TABLE name u use&lt;br /&gt;// @ColumnName is obviously the COLUMN name u use&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;---Get next ID number&lt;br /&gt;	DECLARE &lt;br /&gt;		@ID int&lt;br /&gt;	&lt;br /&gt;	IF (SELECT count(*) FROM @TableName ) &gt; 0&lt;br /&gt;		BEGIN&lt;br /&gt;			SELECT @ID  = max(ColumnName ) from @TableName&lt;br /&gt;			SET @ID = @ID + 1 &lt;br /&gt;		END&lt;br /&gt;	ELSE&lt;br /&gt;	BEGIN&lt;br /&gt;		SET @ID  = 1&lt;br /&gt;	END&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Tue, 11 Sep 2007 07:50:29 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/4521</guid>
      <author>dubby (Dave)</author>
    </item>
    <item>
      <title>Windows XP System Variables</title>
      <link>http://snippets.dzone.com/posts/show/4507</link>
      <description>// Windows XP Default System Variables&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;%SystemDrive%  		C:&lt;br /&gt;&lt;br /&gt;%SystemRoot% 		C:\WINNT, C:\WINDOWS&lt;br /&gt;&lt;br /&gt;%SystemDirectory% 	C:\WINNT\System32, C:\WINDOWS\System32&lt;br /&gt;&lt;br /&gt;%WinDir% 		C:\WINNT, C:\WINDOWS, C:\WINNT\Program Files&lt;br /&gt;&lt;br /&gt;%ComSpec% 		C:\WINNT\system32\cmd.exe&lt;br /&gt;&lt;br /&gt;%Temp% 			C:\DOCUME~1\Usr\LOCALS~1\Temp from C:\Documents and Settings\Usr\Local Settings\Temp&lt;br /&gt;&lt;br /&gt;%HOMEDRIVE% 		C: The drive letter associated with the user's home directory&lt;br /&gt;&lt;br /&gt;%HOMEPATH% 		The path to the user's home directory (excluding drive): \Documents and Settings\Guest&lt;br /&gt;&lt;br /&gt;%OS% 			Windows_NT -&gt; The operating system the user is running&lt;br /&gt;&lt;br /&gt;%USERDOMAIN% 		The name of the domain that contains the user's account&lt;br /&gt;&lt;br /&gt;%USERNAME% 		The user's name&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Fri, 07 Sep 2007 09:09:44 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/4507</guid>
      <author>dubby (Dave)</author>
    </item>
  </channel>
</rss>
