Динамически вводить ключ реестра в зависимости от того, существует ли определенное имя принтера

Я очень начинающий программист в некотором смысле.

Фон:

В моей компании мы используем среду VMware для наших пользователей. Они запускают свой виртуальный рабочий стол, и ThinPrint предоставит новую установку принтера для сеанса этого пользователя. Эта установка принтера определяется VLAN, из которой пользователь входит в систему. Принтер устанавливается с любыми настройками по умолчанию, входящими в состав драйвера.

Проблема:

У нас есть специальный термопринтер Zebra для этикеток, с которым мы столкнулись с проблемой. В принтере используются этикетки определенного размера, которые необходимо определить в драйвере. В отличие от обычных принтеров, в которых используются встроенные формы принтера Windows, в этом принтере Zebra используются эти проприетарные формы, которые называются «запасами». Эти приклады встроены в драйвер Zebra. Я легко могу создать запас нужных размеров и сохранить его, но проблема заключается в том, что он находится в среде виртуальной машины. Мне нужно, чтобы мои нестандартные материалы были частью установки принтера для сеанса, в который входит пользователь. ThinPrint будет каждый раз устанавливать принтер только как новую установку и не будет включать в себя нестандартный запас.

Зачем мне нужна ваша помощь:

Я обнаружил ключ реестра, который соответствует создаваемому мной пользовательскому каталогу. Я могу ввести этот ключ реестра, и сток будет красиво отображаться даже без перезагрузки. Так что я мог легко создать командный файл, который вводит ключ во время входа в систему. Однако раздел реестра - это подраздел конкретного имени принтера. Это означает, что создаваемый мной REG-файл должен быть адаптирован к имени принтера во время сеанса этого пользователя, что, конечно же, будет отличаться для всех различных принтеров zebra, имеющихся в компании.

Вот пример файла REG:

[HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ Print \ Printers \ CC_ZEBRA \ PrinterDriverData \ Papers] "StockNum" = dword: 00000001

[HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ Print \ Printers \ CC_ZEBRA \ PrinterDriverData \ Papers \ 0] «Данные» = шестнадцатеричный: 4f, 6e, 2d, 44,65,6d, 61,6e, 64,00, 00,00,00,00,00,00,00,00,00,00,00,00, \ 00,00,00,00,00,00,00,00,00,00,00,00,00 , 00,00,00,00,00,00,00,00,00,00,00,00, \ 00,00,00,00,00,00,00,00,00,00,00,00, 00,00,00,00,00,01,01,00,00,1e, 00,03,00, \ 00,00,00,00, fe, 00, fa, 02,00,00,00,00 , 00,00,00,00,00,00,00,00,00,00,00,00,00, \ 00,00,00,00,00,00,00,00,00,00,00, 00,00,00,00,00,00,00,00,00,00,00,00,00,00, \ 00,00,00,00,00,00,00,00,00,00,00 , 00,00,00,00,00,00,00,00,00,00,00,00,00,00, \ 00,00,00,00,00,00,00,00,00,00, 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, \ 00,00,00,00,00,00,00,00,00,00 , 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, \ 00,00,00,00,00,00,00,00,00, 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, \ 00,00,00,00,00,00,00,00,00 , 00, ec, 00,00,00

Все в этом файле REG останется прежним, за исключением ключа CC_ZEBRA. Мне нужен способ проанализировать список установленных принтеров и заменить этот ключ именем установленного принтера. В качестве альтернативы я подумал о том, чтобы дать всем нашим принтерам zebra инкрементные имена (Zebra1, Zebra2, Zebra3 и т. Д.) И выполнить цикл до тех пор, пока он не найдет совпадение, а затем запустит адаптированный файл REG, который у меня есть для этого принтера.

Любая помощь или предложения будут оценены всем! Заранее благодарю!


person Corey E    schedule 01.09.2015    source источник


Ответы (1)


Вот простой пример приложения C # (согласно вашим спецификациям), которое получает установленные принтеры и вводит новый ключ реестра, если имя принтера соответствует фильтру. Это было написано с помощью .Net 4.5.

using System;
using System.Drawing.Printing;
using System.Linq;
using Microsoft.Win32;

namespace GetPrintersAndUpdateRegistryExample
{
    class Program
    {
        // Needs to run as admin in order to create subkey in registry
        static void Main(string[] args)
        {
            LaunchServiceUpdate();
        }

        public static void LaunchServiceUpdate()
        {
            for (var i = 0; i < PrinterSettings.InstalledPrinters.Count; i++)
            {
                var printerPath = PrinterSettings.InstalledPrinters[i];

                // Replace \sea_ with a search filter that makes sense for you. All our printers start with 'sea'.
                if (!printerPath.Contains(@"\sea_"))
                {
                    continue;
                }

                var printerName = printerPath.Split('\\').Last();
                CreateRegistryEntry(printerName);
            }
        }

        private static void CreateRegistryEntry(string printerName)
        {
            try
            {
                var regPath = @"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Print\Printers\" + printerName + @"\PrinterDriverData\Papers";
                var key = Registry.LocalMachine.CreateSubKey(regPath);
                key.SetValue("StockNum", 1, RegistryValueKind.DWord);
                key.Close();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
                Console.Read();
            }
        }
    }
}
person GrayDwarf    schedule 01.09.2015