среда, 3 августа 2011 г.

Word Поиск и замена в нескольких файлах (VBA)

Данный код поможет заменить определенную строку в нескольких файлах Word одновременно.
Например это может пригодится, если необходимо заменить номер счета или телефона в корпоративных бланках и т.д.


Инструмент сделан на основе документа Word, с помощью кода VBA. Внешне документ выглядит так:

Два поля, с привязанными Bookmark-ами (SearchFor и ReplaceWith) позволяют обратиться к ним из кода:

    searchFor = ThisDocument.Bookmarks("SearchFor").Range.Text
    replaceWith = ThisDocument.Bookmarks("ReplaceWith").Range.Text

Кнопка вызывает стандартный диалог выбора файлов. Для обработки файлов создается отдельный объект Word, который на всякий случай делается видимым:

    Set wordApp = New Application
    wordApp.Visible = True

Выключаются предупреждения:

    Application.DisplayAlerts = wdAlertsNone
    wordApp.DisplayAlerts = wdAlertsNone

Все файлы последовательно открываются, обрабатываются в цикле и закрываются с сохранением.

    For Each FileName In picker.items
        Set wordDocument = wordApp.Documents.Open(FileName)
        With wordDocument.Content.Find
            .Text = searchFor
            .Replacement.Text = replaceWith
            .Forward = True
            .MatchCase = False
            .Execute Replace:=wdReplaceAll
        End With
        wordDocument.Close SaveChanges:=True
    Next




понедельник, 1 августа 2011 г.

Внедрение скрипта VBScript в EXE-файл (C#)

Создаем пустой консольный проект в C#.

Затем добавляем файл скрипта в ресурсы проэкта
В VS2010 это можно сделать через:
RMB на имени проекта->Properties->Resources->Add Resource->Add New Text File

Теперь можно получить содержимое скрипта, сохранить и запустить его.
Исходный код достаточно прост.


Чтобы получить содержимое скрипта, я использую:

Properties.Resources.MyEmbeddedScript
где MyMbeddedScript - имя ресурса со скриптом.

Получить случайное, временное имя файла для сохранения скрипта:
string scriptFileName = Path.GetTempFileName().Replace(".tmp",".vbs");

Сохранение и запуск скрипта:
File.WriteAllText(scriptFileName, content);
startedProcess = Process.Start(scriptFileName);

Чтобы запустить скрипт под другим пользователем, можно использовать следующий метод:
RunAs без ввода пароля

Аналогичным способом можно превратить любой скрипт (.vbs, .js, .ahk и т.д) в исполняемый .exe-файл.

Исходный код программы:
using System;
using System.Security;
using System.Diagnostics;
using System.IO;

namespace scriptEmbed
{
    class Program
    {
        static int Main(string[] args)
        {
            return RunScript(Properties.Resources.MyEmbeddedScript);
        }
        static int RunScript(string content)
        {
            string scriptFileName = Path.GetTempFileName().Replace(".tmp",".vbs");
            Process startedProcess;
            try
            {
                File.WriteAllText(scriptFileName, content);
                startedProcess = Process.Start(scriptFileName);
                
                while (!startedProcess.HasExited) ;

                File.Delete(scriptFileName);
                
                return startedProcess.ExitCode;
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
                return 1;
            }
        }
        static string GetTempFolder()
        {
            return System.Environment.GetEnvironmentVariable("TEMP");
        }
    }

}





воскресенье, 31 июля 2011 г.

Утилита RunAs с паролем в командной строке (C#)

Альтернатива стандартной утилите RunAs с возможностью задать пароль в командной строке.

Программа делает то-же самое, что и стандартная runas.exe. Единственное отличие - возможность указать пароль напрямую, в командной строке.

Одним из возможных применений может быть выполнение пакетных заданий из под учетной записи администратора.


Синтаксис командной строки:
runasuser [-u пользователь] [-p пароль] [-d домен] someprogram.exe [параметры программы]

Ниже приведен полный исходный код:
using System;
using System.Diagnostics;
using System.Security;

namespace RunAsUser
{
    class Program
    {
        static int Main(string[] args)
        {
            string username = "", password = "", domain = "", apppath = "", arguments = "";

            for( int i=0; i<args.Length; i++)
            {
                switch (args[i].ToLower())
                {
                    case "-u":
                        username = args[++i];
                        break;
                    case "-p":
                        password = args[++i];
                        break;
                    case "-d":
                        domain = args[++i];
                        break;
                    default:
                        if (apppath == "")
                            apppath = args[i];
                        else
                            arguments += args[i] + (i<args.Length?" ":"");
                        break;
                }
            }

            if (args.Length == 0 || apppath == "" )
            {
                Console.WriteLine("\nCommand line syntax:\nrunasuser [-u user] [-p password] [-d domain] someprogram.exe [params]\n");
                return 1;
            }
            Console.WriteLine(arguments);
            return RunAs(apppath, arguments, domain, username, password);

        }
        static int RunAs(string apppath, string arguments, string domain, string username, string password)
        {
            Process userProcess;
            try
            {
                userProcess = Process.Start( apppath, arguments, username, GetSecure(password), domain);
                while (!userProcess.HasExited) ;
                return userProcess.ExitCode;
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }
            return -1;
        }

        static SecureString GetSecure(string str)
        {
            SecureString SecureStr = new SecureString();
            foreach (char c in str)
            {
                SecureStr.AppendChar(c);
            }

            return SecureStr;
        }
    }
}