请教:用checkbox获得win7修改注册表的权限~

时间:2022-09-04 14:04:03
             
    System.Security.Principal.WindowsIdentity identity = System.Security.Principal.WindowsIdentity.GetCurrent();
            //创建Windows用户主题
            Application.EnableVisualStyles();
            System.Security.Principal.WindowsPrincipal principal = new System.Security.Principal.WindowsPrincipal(identity);
            //判断当前登录用户是否为管理员
            if (principal.IsInRole(System.Security.Principal.WindowsBuiltInRole.Administrator)==true)
            {
                //Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new Form1());
            }
            else
            {
                //创建启动对象
                System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
                //设置运行文件
                startInfo.FileName = System.Windows.Forms.Application.ExecutablePath;
                //设置启动参数
                startInfo.Arguments = String.Join(" ", Args);
                //设置启动动作,确保以管理员身份运行
                startInfo.Verb = "runas";
                //如果不是管理员,则启动UAC
                System.Diagnostics.Process.Start(startInfo);
            }


       这上次一位大侠给出了在Main()中获得管理员权限的代码,将代码移植到checkbox下就不行了,望指教~


35 个解决方案

#1


说白点就是点击checkbox后先获得权限,然后再修改注册表以实现开机自动运行(修改注册表自动运行的代码已有)~~在线等

#2


把你移植后的完整代码贴上来看看

#3


   public static void GetAdmin( )
   {
            WindowsIdentity identity = System.Security.Principal.WindowsIdentity.GetCurrent();
            //创建Windows用户主题
            Application.EnableVisualStyles();
            WindowsPrincipal principal = new System.Security.Principal.WindowsPrincipal(identity);
            principal.IsInRole(System.Security.Principal.WindowsBuiltInRole.Administrator);

            if (!principal.IsInRole(WindowsBuiltInRole.Administrator))
            {

                //创建启动对象
                ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
                //设置运行文件
                startInfo.FileName = System.Windows.Forms.Application.ExecutablePath;
                //设置启动参数
                startInfo.Arguments = String.Join(" ", Program.args);
                //设置启动动作,确保以管理员身份运行
                startInfo.Verb = "runas";
                //如果不是管理员,则启动UAC
                System.Diagnostics.Process.Start(startInfo);
                //Application.EnableVisualStyles();
                // Application.SetCompatibleTextRenderingDefault(false);
                // Application.Run(new Form1());
            }
         }

#4


写了个方法在checkbox中调用

#5


别人的方法是在Main方法中调用的,检测程序启动时是否是管理员身份,如果是就直接运行,如果不是就以管理员身份"runas"来运行.

你在程序中的checkbox中调用是不行的,因为它是重新以管理员身份运行的一个新程序,但是新程序里根本就没有执行到你的修改注册表的方法.

建议你单独写个修改注册表的程序A.exe,放在和你现在写的程序目录一起.将GetAdmin中的方法的
//设置运行文件
startInfo.FileName = "A.exe路径";
以管理员身份运行A.exe就可以了

#6


引用 5 楼 xingyuebuyu 的回复:
别人的方法是在Main方法中调用的,检测程序启动时是否是管理员身份,如果是就直接运行,如果不是就以管理员身份"runas"来运行.

你在程序中的checkbox中调用是不行的,因为它是重新以管理员身份运行的一个新程序,但是新程序里根本就没有执行到你的修改注册表的方法.

建议你单独写个修改注册表的程序A.exe,放在和你现在写的程序目录一起.将GetAdmin中的方法的
//设置运行文……

   ls的方法不错,可以考虑~~~有没有别的方法呢?

#7


因为通常情况下都不是管理员身份,改造main方法也可以实现.就是允许main方法接收参数.根据参数进行判断.

//设置启动参数
startInfo.Arguments = String.Join(" ", Program.args);

要修改时就传一个参数进来,根剧参数来决定是否要修改注册表.修改完后直接再退出程序.这样就保证了你只有一个程序在运行了.如果不需要修改注册表就正常运行你的程序既可

#8


引用 7 楼 xingyuebuyu 的回复:
因为通常情况下都不是管理员身份,改造main方法也可以实现.就是允许main方法接收参数.根据参数进行判断.

//设置启动参数
startInfo.Arguments = String.Join(" ", Program.args);

要修改时就传一个参数进来,根剧参数来决定是否要修改注册表.修改完后直接再退出程序.这样就保证了你只有一个程序在运行了.如果不需要修改注册表就正常运行你……

         我已经在Main函数设置类参数string []Args了,那个Program.args只是我在getAdmin()中对Main函数参数的引用而已。。。具体应该怎么弄呢?~

#9



using System;
using System.Collections.Generic;
using System.Windows.Forms;

namespace WindowsApplication1
{
    static class Program
    {
        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        [STAThread]
        static void Main(string[] args)
        {
            if (args != null)
            {
                if (args.Length > 0)
                {
                    if (args[0] == "Modify")
                    {

                        Modfiy();
                        Application.Exit();
                    }
                    else
                    {
                        Application.EnableVisualStyles();
                        Application.SetCompatibleTextRenderingDefault(false);
                        Application.Run(new Form1());
                    }
           
                }
            }
        }
    }
}


Modfiy方法进行修改清册表.修改完后就退出这个程序,保证只有一个程序在运行.其它地方保持不变

#10



using System;
using System.Collections.Generic;
using System.Windows.Forms;

namespace WindowsApplication1
{
    static class Program
    {
        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        [STAThread]
        static void Main(string[] args)
        {
            if (args != null)
            {
                if (args.Length > 0)
                {
                    if (args[0] == "Modify")
                    {
                        GetAdmin();
                        Modfiy();
                        Application.Exit();
                        return;
                    }
                }
            }

            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    }
}


上面那个写的不够严密,看这个

#11


还是在Main中修改程序获得管理员权限?我想要在checkbox中实现哇~~

#12


谢谢你了,但是我的意图是想要点击checkbox后才获得管理员权限,进而修改注册表,原本在xp下是点击checkbox之后直接修改注册表的,在win7下就不行了。若是在main中获得权限,每次运行程序的时候系统都会提示是否允许该程序运行,这样多不方便啊╮(╯▽╰)╭,所以想只点击checkbox才获得管理员权限进而修改注册表~

#13


晕倒,你没明白我的意思.
你双击程序,程序因为没有传入参数,所以在检测 "Modify"这个参数,没有检测到就会往下继续执行.也就是运行            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
这样你的主界面就显示出来了.

然后你点主界面的checkbox后再调用GetAdmin方法,只是这个时候要传入"Modify"这个参数,这样程序执行时就会进入
if (args != null)
            {
                if (args.Length > 0)
                {
                    if (args[0] == "Modify")
                    {
                        GetAdmin();
                        Modfiy();
                        Application.Exit();
                        return;
                    }
                }
            }
这样就会修改注册表了,扫行完后就return,这样程序就退出了.你原来的程序还是存在的,也是有界面的

#14


噢...好,灰常感谢啊,,项目只剩下最后这个功能没实现了,完后马上结贴....

#15


试试看先。。。

#16


吃完饭后再试了一下...按F5运行后可以修改注册表,但是双击exe运行之后,点击checkbox就又不让修改让修改注册表了,请问是怎么一回事??

#17


你单步调试下啊,加几个对话框看看程序走的流程是不是对的.

双击exe运行之后,点击checkbox就又不让修改让修改注册表了?
不明白你的意思,把你把的流程详细的说下

把完整代码也贴上来看看

#18


  [STAThread]
        static void Main(string[]Args)
        {
            //args = Args;
            int processcount = 0;
            Process[] pro = Process.GetProcesses();
            foreach (Process isPro in pro)
            {
                if (isPro.ProcessName == Process.GetCurrentProcess().ProcessName)
                {
                    processcount += 1;
                }
            }
            if (processcount > 1)
            {

                //MessageBox.Show("a instance has already run!", "信息提示", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }

            else if (Args != null)
            {
                if (Args.Length > 0)
                {
                    if (Args[0] == "autunRun")
                    {
                        SysOper.GetAdmin(Args);
                        RegistryInfo.AutunRun(true);
                        Application.Exit();
                        return;
                    }
                }

             
            }

            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());

           /* else
            {
                Application.EnableVisualStyles();
                Application.DoEvents();
                Application.Run(new Form1());
            }
            */
           
        }

    }
}

这是main函数的代码

#19


就是在启动调试后,点击checkbox可以修改注册表,程序没跑出异常,但是退出调试后运行程序,点击checkbox,就弹出异常消息框了~~

#20


你给出的前面几行代码是我为了防止运行多个进程而添加的~

#21


晕倒,你应该把if (Args != null)
{
if (Args.Length > 0)
{
if (Args[0] == "autunRun")
{
SysOper.GetAdmin(Args);
RegistryInfo.AutunRun(true);
Application.Exit();
return;
}
}

防止运行多个进程的部分要放在修改注册表的后面.

因为你在调试时的进程名字和你双击时的进程名字是不一样的,所以你点checkbox后可以用Process.Start的方法运行一个程序,然后就可以修改注册表了.

但是你双击程序运行时,Process.Start运行的进程的名字就是一样的了,这个时候你的程序就会执行到防止程序多开的部分,而修改注册表的部分没有执行到.

所以交换两者的顺序就可以了

#22


不行啊~~放在后面也没反应...

#23


 


 static void Main(string[]Args)
        {
            //args = Args;
            int processcount = 0;
            Process[] pro = Process.GetProcesses();
            foreach (Process isPro in pro)
            {
                if (isPro.ProcessName == Process.GetCurrentProcess().ProcessName)
                {
                    processcount += 1;
                }
            }

            if (Args != null)
            {
                if (Args.Length > 0)
                {
                    if (Args[0] == "autoRun")
                    {
                        SysOper.GetAdmin(Args);
                        RegistryInfo.autoRun(true);
                        Application.Exit();
                        return;
                    }
                }
            }

            if (processcount > 1)
            {

                //MessageBox.Show("a instance  has already run!", "信息提示", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }

                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new Form1());
 

这样?ms不起作用~

#24



static void Main(string[]Args)
{
//args = Args;


if (Args != null)
{
if (Args.Length > 0)
{
if (Args[0] == "autoRun")
{
SysOper.GetAdmin(Args);
RegistryInfo.autoRun(true);
Application.Exit();
return;
}
}
}

int processcount = 0;
Process[] pro = Process.GetProcesses();
foreach (Process isPro in pro)
{
if (isPro.ProcessName == Process.GetCurrentProcess().ProcessName)
{
processcount += 1;
}
}

if (processcount > 1)
{

//MessageBox.Show("a instance has already run!", "信息提示", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
Return;
}

Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());


晕倒了,说了半天你没看明白

先判断要不要修改注册表,要就修改,修改完了就退出程序.
如果不要修改,就判断当前的程序是否多开了,如果多开就退出,如果没有就继续运行出现程序的主界面.

你上面的修改和之前的效果是一样的,等于没改.

#25


学习。。。。。。。。。。

#26


    public static void GetAdmin( string[]args )
        {
            WindowsIdentity identity = System.Security.Principal.WindowsIdentity.GetCurrent();
            Application.EnableVisualStyles();
            WindowsPrincipal principal = new System.Security.Principal.WindowsPrincipal(identity);
            principal.IsInRole(System.Security.Principal.WindowsBuiltInRole.Administrator);
            if (!principal.IsInRole(WindowsBuiltInRole.Administrator))
            {
                ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
                startInfo.FileName = System.Windows.Forms.Application.ExecutablePath;
             
                startInfo.Arguments = String.Join("", args);
                startInfo.Verb = "runas";
                System.Diagnostics.Process.Start(startInfo);
                //退出
               //  System.Windows.Forms.Application.Exit();
            }
         }

这是GetAmin()方法,这样又问题吗?用你上面调回来后的代码也不行,无论调试运行与否,点击checkbox后都会抛出异常了~~~~

#27


 


     private void checkBox3_CheckedChanged(object sender, EventArgs e)
        {
            //SysOper.GetAdmin(Program.args);
            bool Flag = auntunstartup.IsRegeditExist("WinForm");
            if (checkBox3.Checked == true)
            {
              
                WritePrivateProfileString("IsAutunRun", "isautunrun", "Yes", FileName);
                if (Flag == false)
                {
                      RegistryInfo.autoRun(true);
                }
            }
            else
            {
                auntunstartup.DeleteRegist("WinForm");
                WritePrivateProfileString("IsAutunRun", null, null, FileName);
            }
            
        }

checkbox中的code也顺便贴出看看...

#28


哈哈,谢啦,已经结贴,不好意思再问下去了,我还是再花点时间摸索一下吧,刚开学,还有点时间。。。

#29


bool Flag = auntunstartup.IsRegeditExist("WinForm");
这个是什么意思?

private void checkBox3_CheckedChanged(object sender, EventArgs e)
{
//SysOper.GetAdmin(Program.args);
bool Flag = auntunstartup.IsRegeditExist("WinForm");
if (checkBox3.Checked == true)
{

WritePrivateProfileString("IsAutunRun", "isautunrun", "Yes", FileName);

//这里有调用GetAdmin方法,你如果不调用程序根本就不会以管理员身分重新运行一个新的程序.

SysOper.GetAdmin("autoRun");

if (Flag == false)
{
RegistryInfo.autoRun(true);
}
}
else
{
auntunstartup.DeleteRegist("WinForm");
WritePrivateProfileString("IsAutunRun", null, null, FileName);
}


main方法中就不需要调用GetAdmin方法了.


static void Main(string[]Args)
{
//args = Args;


if (Args != null)
{
if (Args.Length > 0)
{
if (Args[0] == "autoRun")
{
//这里就不需要了,因为在checkbox里已经用管理员身份在运行了
//SysOper.GetAdmin(Args);


RegistryInfo.autoRun(true);
Application.Exit();
return;
}
}
}

int processcount = 0;
Process[] pro = Process.GetProcesses();
foreach (Process isPro in pro)
{
if (isPro.ProcessName == Process.GetCurrentProcess().ProcessName)
{
processcount += 1;
}
}

if (processcount > 1)
{

//MessageBox.Show("a instance has already run!", "信息提示", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
Return;
}

Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());



#30


bool Flag = auntunstartup.IsRegeditExist("WinForm");
呵呵,这句是定义判断是否已经改变注册表的变量,方便下面代码对注册表的修改或者清零,auntunstarup是一个累的对象。。。。

#31


SysOper.GetAdmin("autoRun");

这个。。。不能这样调用吧?我的函数定义为GetAdmin(string []args),字符串不能为参数。。

#32


没看清,那你把定义改下就好了,只需要string类型就可以的
SysOper.GetAdmin("autoRun");

#33


   startInfo.Arguments = String.Join(" ", args);
   
定义的参数是为了传给join的第二个参数啊。。。。它规定了第二个参数必须为字符串数组类型的,我才应是为了接受main的参数吧。。。

#34


   string[] str = new string[] { "autoRun"};
   SysOper.GetAdmin(str);

思路对了,其它的就好说了.需要怎么改你就怎么改就可以了.

#35


  static void Main(string[] args)
        {
            if (args != null)
            {
                if (args.Length > 0)
                {
                    if (args[0] == "Modify")
                    {

                        Modfiy();
                        Application.Exit();
                    }
                    else
                    {
                        Application.EnableVisualStyles();
                        Application.SetCompatibleTextRenderingDefault(false);
                        Application.Run(new Form1());
                    }
           
                }
            }
我想请问一下子if (args[0] == "Modify")
Modify参数是修改注册表的方法吗?它又是怎么传到GetAdmin()方法中的呢 ?

#1


说白点就是点击checkbox后先获得权限,然后再修改注册表以实现开机自动运行(修改注册表自动运行的代码已有)~~在线等

#2


把你移植后的完整代码贴上来看看

#3


   public static void GetAdmin( )
   {
            WindowsIdentity identity = System.Security.Principal.WindowsIdentity.GetCurrent();
            //创建Windows用户主题
            Application.EnableVisualStyles();
            WindowsPrincipal principal = new System.Security.Principal.WindowsPrincipal(identity);
            principal.IsInRole(System.Security.Principal.WindowsBuiltInRole.Administrator);

            if (!principal.IsInRole(WindowsBuiltInRole.Administrator))
            {

                //创建启动对象
                ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
                //设置运行文件
                startInfo.FileName = System.Windows.Forms.Application.ExecutablePath;
                //设置启动参数
                startInfo.Arguments = String.Join(" ", Program.args);
                //设置启动动作,确保以管理员身份运行
                startInfo.Verb = "runas";
                //如果不是管理员,则启动UAC
                System.Diagnostics.Process.Start(startInfo);
                //Application.EnableVisualStyles();
                // Application.SetCompatibleTextRenderingDefault(false);
                // Application.Run(new Form1());
            }
         }

#4


写了个方法在checkbox中调用

#5


别人的方法是在Main方法中调用的,检测程序启动时是否是管理员身份,如果是就直接运行,如果不是就以管理员身份"runas"来运行.

你在程序中的checkbox中调用是不行的,因为它是重新以管理员身份运行的一个新程序,但是新程序里根本就没有执行到你的修改注册表的方法.

建议你单独写个修改注册表的程序A.exe,放在和你现在写的程序目录一起.将GetAdmin中的方法的
//设置运行文件
startInfo.FileName = "A.exe路径";
以管理员身份运行A.exe就可以了

#6


引用 5 楼 xingyuebuyu 的回复:
别人的方法是在Main方法中调用的,检测程序启动时是否是管理员身份,如果是就直接运行,如果不是就以管理员身份"runas"来运行.

你在程序中的checkbox中调用是不行的,因为它是重新以管理员身份运行的一个新程序,但是新程序里根本就没有执行到你的修改注册表的方法.

建议你单独写个修改注册表的程序A.exe,放在和你现在写的程序目录一起.将GetAdmin中的方法的
//设置运行文……

   ls的方法不错,可以考虑~~~有没有别的方法呢?

#7


因为通常情况下都不是管理员身份,改造main方法也可以实现.就是允许main方法接收参数.根据参数进行判断.

//设置启动参数
startInfo.Arguments = String.Join(" ", Program.args);

要修改时就传一个参数进来,根剧参数来决定是否要修改注册表.修改完后直接再退出程序.这样就保证了你只有一个程序在运行了.如果不需要修改注册表就正常运行你的程序既可

#8


引用 7 楼 xingyuebuyu 的回复:
因为通常情况下都不是管理员身份,改造main方法也可以实现.就是允许main方法接收参数.根据参数进行判断.

//设置启动参数
startInfo.Arguments = String.Join(" ", Program.args);

要修改时就传一个参数进来,根剧参数来决定是否要修改注册表.修改完后直接再退出程序.这样就保证了你只有一个程序在运行了.如果不需要修改注册表就正常运行你……

         我已经在Main函数设置类参数string []Args了,那个Program.args只是我在getAdmin()中对Main函数参数的引用而已。。。具体应该怎么弄呢?~

#9



using System;
using System.Collections.Generic;
using System.Windows.Forms;

namespace WindowsApplication1
{
    static class Program
    {
        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        [STAThread]
        static void Main(string[] args)
        {
            if (args != null)
            {
                if (args.Length > 0)
                {
                    if (args[0] == "Modify")
                    {

                        Modfiy();
                        Application.Exit();
                    }
                    else
                    {
                        Application.EnableVisualStyles();
                        Application.SetCompatibleTextRenderingDefault(false);
                        Application.Run(new Form1());
                    }
           
                }
            }
        }
    }
}


Modfiy方法进行修改清册表.修改完后就退出这个程序,保证只有一个程序在运行.其它地方保持不变

#10



using System;
using System.Collections.Generic;
using System.Windows.Forms;

namespace WindowsApplication1
{
    static class Program
    {
        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        [STAThread]
        static void Main(string[] args)
        {
            if (args != null)
            {
                if (args.Length > 0)
                {
                    if (args[0] == "Modify")
                    {
                        GetAdmin();
                        Modfiy();
                        Application.Exit();
                        return;
                    }
                }
            }

            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    }
}


上面那个写的不够严密,看这个

#11


还是在Main中修改程序获得管理员权限?我想要在checkbox中实现哇~~

#12


谢谢你了,但是我的意图是想要点击checkbox后才获得管理员权限,进而修改注册表,原本在xp下是点击checkbox之后直接修改注册表的,在win7下就不行了。若是在main中获得权限,每次运行程序的时候系统都会提示是否允许该程序运行,这样多不方便啊╮(╯▽╰)╭,所以想只点击checkbox才获得管理员权限进而修改注册表~

#13


晕倒,你没明白我的意思.
你双击程序,程序因为没有传入参数,所以在检测 "Modify"这个参数,没有检测到就会往下继续执行.也就是运行            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
这样你的主界面就显示出来了.

然后你点主界面的checkbox后再调用GetAdmin方法,只是这个时候要传入"Modify"这个参数,这样程序执行时就会进入
if (args != null)
            {
                if (args.Length > 0)
                {
                    if (args[0] == "Modify")
                    {
                        GetAdmin();
                        Modfiy();
                        Application.Exit();
                        return;
                    }
                }
            }
这样就会修改注册表了,扫行完后就return,这样程序就退出了.你原来的程序还是存在的,也是有界面的

#14


噢...好,灰常感谢啊,,项目只剩下最后这个功能没实现了,完后马上结贴....

#15


试试看先。。。

#16


吃完饭后再试了一下...按F5运行后可以修改注册表,但是双击exe运行之后,点击checkbox就又不让修改让修改注册表了,请问是怎么一回事??

#17


你单步调试下啊,加几个对话框看看程序走的流程是不是对的.

双击exe运行之后,点击checkbox就又不让修改让修改注册表了?
不明白你的意思,把你把的流程详细的说下

把完整代码也贴上来看看

#18


  [STAThread]
        static void Main(string[]Args)
        {
            //args = Args;
            int processcount = 0;
            Process[] pro = Process.GetProcesses();
            foreach (Process isPro in pro)
            {
                if (isPro.ProcessName == Process.GetCurrentProcess().ProcessName)
                {
                    processcount += 1;
                }
            }
            if (processcount > 1)
            {

                //MessageBox.Show("a instance has already run!", "信息提示", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }

            else if (Args != null)
            {
                if (Args.Length > 0)
                {
                    if (Args[0] == "autunRun")
                    {
                        SysOper.GetAdmin(Args);
                        RegistryInfo.AutunRun(true);
                        Application.Exit();
                        return;
                    }
                }

             
            }

            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());

           /* else
            {
                Application.EnableVisualStyles();
                Application.DoEvents();
                Application.Run(new Form1());
            }
            */
           
        }

    }
}

这是main函数的代码

#19


就是在启动调试后,点击checkbox可以修改注册表,程序没跑出异常,但是退出调试后运行程序,点击checkbox,就弹出异常消息框了~~

#20


你给出的前面几行代码是我为了防止运行多个进程而添加的~

#21


晕倒,你应该把if (Args != null)
{
if (Args.Length > 0)
{
if (Args[0] == "autunRun")
{
SysOper.GetAdmin(Args);
RegistryInfo.AutunRun(true);
Application.Exit();
return;
}
}

防止运行多个进程的部分要放在修改注册表的后面.

因为你在调试时的进程名字和你双击时的进程名字是不一样的,所以你点checkbox后可以用Process.Start的方法运行一个程序,然后就可以修改注册表了.

但是你双击程序运行时,Process.Start运行的进程的名字就是一样的了,这个时候你的程序就会执行到防止程序多开的部分,而修改注册表的部分没有执行到.

所以交换两者的顺序就可以了

#22


不行啊~~放在后面也没反应...

#23


 


 static void Main(string[]Args)
        {
            //args = Args;
            int processcount = 0;
            Process[] pro = Process.GetProcesses();
            foreach (Process isPro in pro)
            {
                if (isPro.ProcessName == Process.GetCurrentProcess().ProcessName)
                {
                    processcount += 1;
                }
            }

            if (Args != null)
            {
                if (Args.Length > 0)
                {
                    if (Args[0] == "autoRun")
                    {
                        SysOper.GetAdmin(Args);
                        RegistryInfo.autoRun(true);
                        Application.Exit();
                        return;
                    }
                }
            }

            if (processcount > 1)
            {

                //MessageBox.Show("a instance  has already run!", "信息提示", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }

                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new Form1());
 

这样?ms不起作用~

#24



static void Main(string[]Args)
{
//args = Args;


if (Args != null)
{
if (Args.Length > 0)
{
if (Args[0] == "autoRun")
{
SysOper.GetAdmin(Args);
RegistryInfo.autoRun(true);
Application.Exit();
return;
}
}
}

int processcount = 0;
Process[] pro = Process.GetProcesses();
foreach (Process isPro in pro)
{
if (isPro.ProcessName == Process.GetCurrentProcess().ProcessName)
{
processcount += 1;
}
}

if (processcount > 1)
{

//MessageBox.Show("a instance has already run!", "信息提示", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
Return;
}

Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());


晕倒了,说了半天你没看明白

先判断要不要修改注册表,要就修改,修改完了就退出程序.
如果不要修改,就判断当前的程序是否多开了,如果多开就退出,如果没有就继续运行出现程序的主界面.

你上面的修改和之前的效果是一样的,等于没改.

#25


学习。。。。。。。。。。

#26


    public static void GetAdmin( string[]args )
        {
            WindowsIdentity identity = System.Security.Principal.WindowsIdentity.GetCurrent();
            Application.EnableVisualStyles();
            WindowsPrincipal principal = new System.Security.Principal.WindowsPrincipal(identity);
            principal.IsInRole(System.Security.Principal.WindowsBuiltInRole.Administrator);
            if (!principal.IsInRole(WindowsBuiltInRole.Administrator))
            {
                ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
                startInfo.FileName = System.Windows.Forms.Application.ExecutablePath;
             
                startInfo.Arguments = String.Join("", args);
                startInfo.Verb = "runas";
                System.Diagnostics.Process.Start(startInfo);
                //退出
               //  System.Windows.Forms.Application.Exit();
            }
         }

这是GetAmin()方法,这样又问题吗?用你上面调回来后的代码也不行,无论调试运行与否,点击checkbox后都会抛出异常了~~~~

#27


 


     private void checkBox3_CheckedChanged(object sender, EventArgs e)
        {
            //SysOper.GetAdmin(Program.args);
            bool Flag = auntunstartup.IsRegeditExist("WinForm");
            if (checkBox3.Checked == true)
            {
              
                WritePrivateProfileString("IsAutunRun", "isautunrun", "Yes", FileName);
                if (Flag == false)
                {
                      RegistryInfo.autoRun(true);
                }
            }
            else
            {
                auntunstartup.DeleteRegist("WinForm");
                WritePrivateProfileString("IsAutunRun", null, null, FileName);
            }
            
        }

checkbox中的code也顺便贴出看看...

#28


哈哈,谢啦,已经结贴,不好意思再问下去了,我还是再花点时间摸索一下吧,刚开学,还有点时间。。。

#29


bool Flag = auntunstartup.IsRegeditExist("WinForm");
这个是什么意思?

private void checkBox3_CheckedChanged(object sender, EventArgs e)
{
//SysOper.GetAdmin(Program.args);
bool Flag = auntunstartup.IsRegeditExist("WinForm");
if (checkBox3.Checked == true)
{

WritePrivateProfileString("IsAutunRun", "isautunrun", "Yes", FileName);

//这里有调用GetAdmin方法,你如果不调用程序根本就不会以管理员身分重新运行一个新的程序.

SysOper.GetAdmin("autoRun");

if (Flag == false)
{
RegistryInfo.autoRun(true);
}
}
else
{
auntunstartup.DeleteRegist("WinForm");
WritePrivateProfileString("IsAutunRun", null, null, FileName);
}


main方法中就不需要调用GetAdmin方法了.


static void Main(string[]Args)
{
//args = Args;


if (Args != null)
{
if (Args.Length > 0)
{
if (Args[0] == "autoRun")
{
//这里就不需要了,因为在checkbox里已经用管理员身份在运行了
//SysOper.GetAdmin(Args);


RegistryInfo.autoRun(true);
Application.Exit();
return;
}
}
}

int processcount = 0;
Process[] pro = Process.GetProcesses();
foreach (Process isPro in pro)
{
if (isPro.ProcessName == Process.GetCurrentProcess().ProcessName)
{
processcount += 1;
}
}

if (processcount > 1)
{

//MessageBox.Show("a instance has already run!", "信息提示", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
Return;
}

Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());



#30


bool Flag = auntunstartup.IsRegeditExist("WinForm");
呵呵,这句是定义判断是否已经改变注册表的变量,方便下面代码对注册表的修改或者清零,auntunstarup是一个累的对象。。。。

#31


SysOper.GetAdmin("autoRun");

这个。。。不能这样调用吧?我的函数定义为GetAdmin(string []args),字符串不能为参数。。

#32


没看清,那你把定义改下就好了,只需要string类型就可以的
SysOper.GetAdmin("autoRun");

#33


   startInfo.Arguments = String.Join(" ", args);
   
定义的参数是为了传给join的第二个参数啊。。。。它规定了第二个参数必须为字符串数组类型的,我才应是为了接受main的参数吧。。。

#34


   string[] str = new string[] { "autoRun"};
   SysOper.GetAdmin(str);

思路对了,其它的就好说了.需要怎么改你就怎么改就可以了.

#35


  static void Main(string[] args)
        {
            if (args != null)
            {
                if (args.Length > 0)
                {
                    if (args[0] == "Modify")
                    {

                        Modfiy();
                        Application.Exit();
                    }
                    else
                    {
                        Application.EnableVisualStyles();
                        Application.SetCompatibleTextRenderingDefault(false);
                        Application.Run(new Form1());
                    }
           
                }
            }
我想请问一下子if (args[0] == "Modify")
Modify参数是修改注册表的方法吗?它又是怎么传到GetAdmin()方法中的呢 ?