2

Citrix サーバー (Server 2008 R2) でプリンターの名前を変更する C# アプリケーションを作成しました。

この理由は、ユーザーがログオンするたびにプリンターがサーバーに転送され、一意の名前 (セッション 3 の Microsoft XPS Document Writer (WI_UFivcBY4-wgoYOdlQ から) など) を取得するためです。プリンターはその名前を指しているため、セッションにログオンするたびにプリンター設定を変更する必要があります。

プログラム自体は魔法のように機能し、プリンターは私が望む名前を取得します。ただし、問題は、プリンターの名前が変更された後です。Windows はプリンターを識別できなくなっているようです。たとえば、デフォルトのプリンターを変更しようとすると、「エラー 0x00000709 プリンター名を再確認し、プリンターがネットワークに接続されていることを確認してください」というエラーが表示されます。

            var query = new ManagementObjectSearcher("SELECT * FROM Win32_Printer where name like '%(%'"); 

            ManagementObjectCollection result = query.Get();

            foreach (ManagementObject printer in result)
            {
                string printerName = printer["name"].ToString();

                if (printerName.IndexOf('(') > 0)
                {
                    printer.InvokeMethod("RenamePrinter", new object[] { printerName.Substring(0, printerName.IndexOf('(')).Trim() + " " + userName }); //userName is provided as an inputparameter when running the application
                }
            }

何か不足していますか?改名時に他に何かする必要はありますか?この事件に関する情報はまったく見つからないようです。

4

1 に答える 1

3

このコードプロジェクトはあなたが探しているものだと思います。しかし、プリンターを使ったいくつかの経験の後、C#私はそれが面白くなく、本当にイライラする可能性があるとしか言えません

小さな変更を加えたコード:

//Renames the printer
public static void RenamePrinter(string sPrinterName, string newName)
{
    ManagementScope oManagementScope = new ManagementScope(ManagementPath.DefaultPath);
    oManagementScope.Connect();

    SelectQuery oSelectQuery = new SelectQuery();
    oSelectQuery.QueryString = @"SELECT * FROM Win32_Printer WHERE Name = '" + sPrinterName.Replace("\\", "\\\\") + "'";

    ManagementObjectSearcher oObjectSearcher =
        new ManagementObjectSearcher(oManagementScope, oSelectQuery);
    ManagementObjectCollection oObjectCollection = oObjectSearcher.Get();

    if (oObjectCollection.Count == 0)
        return;

    foreach (ManagementObject oItem in oObjectCollection)
    {
        int state = (int)oItem.InvokeMethod("RenamePrinter", new object[] { newName });
        switch (state)
        {
            case 0:
                //Success do noting else
                return;
            case 1:
                throw new AccessViolationException("Access Denied");
            case 1801:
                throw new ArgumentException("Invalid Printer Name");
            default:
                break;
        }
    }
}
于 2013-05-10T23:26:42.843 に答える