批量转换抛出System.Security.SecurityException

时间:2015-10-02 15:08:23

标签: java c# batch-file cmd registry

我已经关注了.bat - 建议用于打开完全正常java_cmd便携式任务的文件。

@echo off
cd /d "%~dp0"
:: cd ..\CommonFiles
:: set Path=%cd%\bin;%path%

set Path=%~d0\PortableApps\CommonFiles\bin;%path%

:: set "JAVA_HOME=%~d0\PortableApps\CommonFiles\jre"

set "JAVA_HOME=%~d0\PortableApps\CommonFiles"

nircmd regsetval dword "HKCU\console" "QuickEdit" "1" >nul 2>&1

cd /d "\Documents\workspaces\java"

start "Java_cmd" cmd /k "cs -w 100x25 -b 100x3000"

到目前为止,我已翻译成以下内容:

using Microsoft.Win32;
using System;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Runtime.InteropServices;
using con = System.Console;

namespace javacmd
{
    class Program
    {
        const int HWND_BROADCAST = 0xffff;
        const uint WM_SETTINGCHANGE = 0x001a;

        [DllImport("user32", SetLastError = true, CharSet = CharSet.Auto)]
        static extern bool SendNotifyMessage(IntPtr hWnd, uint Msg, UIntPtr wParam, string lParam);

        static string codeBase = Assembly.GetExecutingAssembly().CodeBase;
        static string drive = Path.GetPathRoot(codeBase);
        static string oldjavahome = "";

        static int Main(string[] args)
        {
            PrintOutStart();
            string args0 = null;
            try
            {
                if (args == null || args0 == "?" || args0 == "/?" || args0 == "--?" ||  args0 == "help" || args0 == "/help" || args0 == "--help")
                {
                    return PrintOutHelp();
                }
                else
                {
                    args0 = args[0];
                }
            }
            catch
            {
                return PrintOutHelp();
            }
            if (args0 != null)
            {
                if (!File.Exists(args0+ ".java"))
                {
                    con.WriteLine($"Error: FileNotFound!\nDie Datei {args0} wurde nicht gefunden. Bitte überprüfen Sie, dass\nSie den Namen richtig geschrieben haben!");
                    con.WriteLine("");
                    con.Write("Drücken Sie eine beliebige Taste . . .  ");
                    con.ReadLine();
                    return 1;
                }
                else
                {
                    string javahome = Path.Combine(drive, @"PortableApps\CommonFiles");
                    string javabin = Path.Combine(drive, @"PortableApps\CommonFiles\bin");

                    using (var key = Registry.LocalMachine.OpenSubKey(@"SYSTEM\CurrentControlSet\Control\Session Manager\Environment", true))
                    {
                        var ojh = key.GetValue("JAVA_HOME");
                        if (ojh != null)
                        {
                            oldjavahome = ojh.ToString();
                            if (oldjavahome != javahome)
                            {
                                key.SetValue("JAVA_HOME", javahome);
                            }
                        }
                        var path = key.GetValue("path");
                        if (path != null)
                        {
                            if (!path.ToString().Contains(javabin))
                            {
                                key.SetValue("Path", javabin + ";" + path);
                            }
                        }
                        SendNotifyMessage((IntPtr)HWND_BROADCAST, WM_SETTINGCHANGE, (UIntPtr)0, "Environment");
                    }
                    Process p = new Process() { StartInfo = new ProcessStartInfo() { FileName = "javac", Arguments = $"{args0}.java", CreateNoWindow = true, RedirectStandardOutput = true } };
                    try
                    {
                        p.Start();
                        p.WaitForExit();
                        con.WriteLine($"output javac: \"{p.StandardOutput}\"");
                    }
                    catch
                    {
                        con.WriteLine("Error while compiling!\nFehler während des Kompilier-Vorgangs!");
                        con.WriteLine("");
                        con.Write("Drücken Sie eine beliebige Taste . . .  ");
                        con.ReadLine();
                        return 1;
                    }
                    p.StartInfo.FileName = "java";
                    p.StartInfo.Arguments = args0;
                    try
                    {
                        p.Start();
                        p.WaitForExit();
                        con.WriteLine($"output java: \"{p.StandardOutput}\"");
                    }
                    catch
                    {
                        con.WriteLine("Fehler während des Start-Vorgangs!");
                        con.WriteLine("");
                        con.Write("Drücken Sie eine beliebige Taste . . .  ");
                        con.ReadLine();
                        return 1;
                    }
                }
            }
            else
            {
                con.WriteLine("Der benötigte Parameter \"args0\" hat den Wert \"null\". Bitte versuchen Sie es erneut!");
                con.WriteLine("");
                con.Write("Drücken Sie eine beliebige Taste . . .  ");
                con.ReadLine();
                return 1;
            }
            return 0;
        }

        private static void PrintOutStart()
        {
            con.WriteLine("");
            con.WriteLine("###################################################");
            con.WriteLine("#                                                 #");
            con.WriteLine("#                     javacmd                     #");
            con.WriteLine("#                                                 #");
            con.WriteLine("###################################################");
            con.WriteLine("");
        }

        private static int PrintOutHelp()
        {
            string name = Path.GetFileNameWithoutExtension(codeBase);
            con.WriteLine("Der javacmd compiliert und startet eine angegebene .java-Datei mit nur einem Befehl.");
            con.WriteLine("");
            con.WriteLine("Syntax: " + name + ".exe [name | [  | / | --]? | [  | / | --]help]");
            con.WriteLine("");
            con.WriteLine("  name\t\t\tDie zu startende Datei (ohne die Endung \".java\").");
            con.WriteLine("  [  | / | --]?\t\tZeigt die Hilfe an. Dies entspricht einer Eingabe ohne Optionen.");
            con.WriteLine("  [  | / | --]help\tZeigt die Hilfe an. Dies entspricht einer Eingabe ohne Optionen.");
            con.WriteLine("");
            con.WriteLine("Wird der javacmd ohne Argument aufgerufen, zeigt er diese Hilfe an.");
            con.WriteLine("");
            con.Write("Drücken Sie eine beliebige Taste . . .  ");
            con.ReadLine();
            return 1;
        }
    }
}

问题是它在打开reigstry键时抛出System.Security.SecurityException。我认为这是由于缺少管理员权限造成的 - 我不想在我想要使用该程序的所有计算机上获得这些权限。如何使此代码与批处理代码一样运行?

我的程序位于\Documents\workspaces\java,其中Documents是(root)usb驱动器的子代。

提前致谢!

0 个答案:

没有答案