Process.Start Azure文件共享

时间:2017-07-31 13:31:49

标签: c# azure process process.start

现在已经为Azure文件共享设置了SMB 3.0的所有内容,只需打开一个新的资源管理器窗口并导航到\\ myfileshare.file.core.windows.net \ myfileshare即可。我已经构建了一个c#应用程序,它将用户名和密码保存到azure文件共享中,以便以后使用。

为了使应用程序更加用户友好(主要由SysAdmins使用),我想添加一个文件>打开Azure文件共享按钮。这是我遇到麻烦的地方。

我将从一些给定的信息开始:​​uncPath是文件共享的完整信息。这是我尝试过的代码:

Process.Start(uncPath, username, password.ToSecureString(), ".");
--> Throws a Win32Exception, Username or Password incorrect 
--> (They are both correct, The Domain is throwing this off.)

我永远无法解决这个问题,所以我走了另一条路。 NET使用文件共享,然后打开它。这是有效的,但我想在用户存在进程时取消映射共享。 (我不想留下映射的驱动器。)这是我试过的代码:

/* --- MAP THE DRIVE --- */
Process p = new Process
{
    StartInfo = new ProcessStartInfo
    {
        FileName = "net.exe",
        Arguments = $"use {uncPath} /u:{username} {password}",
        RedirectStandardOutput = true,
        RedirectStandardError = true,
        UseShellExecute = false,
    }
};
p.Start();


/* --- OPEN THE UNC PATH --- */
Process azureP = new Process
{
    StartInfo =
        {
            FileName = "explorer.exe",
            Arguments = uncPath,
            UseShellExecute = false,
        },
    EnableRaisingEvents = true,
};
azureP.Start();

/* -- UNMAP THE DRIVE ON EXIT --- */
azureP.Exited += ((object proc, EventArgs procE) =>
{
    Process azurePExit = new Process
    {
        StartInfo = new ProcessStartInfo
        {
            FileName = "net.exe",
            Arguments = $"use {uncPath} /delete",
            RedirectStandardOutput = true,
            RedirectStandardError = true
        }
    };
});

正如预期的那样,azureP.Exited会立即触发,和我理解为什么

打开azure文件共享的最佳方法是什么?

2 个答案:

答案 0 :(得分:1)

  

打开azure文件共享的最佳方法是什么?

在我看来,在本地访问文件共享的最佳方法是使用SMB3.0挂载作为磁盘。

所以我仍然建议您使用命令来安装并使用Windows资源管理器打开它。

但是,正如您的代码所示,azureP流程不会影响资源管理器流程。

因此将立即触发退出方法。

这是解决方法。

我建议你可以让azureP进程启动资源管理器进程ID。

然后你可以使用Process.GetProcessesByName(" explorer")方法来获取 所有当前的资源管理器进程。

然后您可以编写一个while循环来检查所选进程是否已根据进程ID打开资源管理器。

如果该过程不存在,那么您可以删除装载磁盘并中断。

注意:

如果客户关闭资源管理器,该过程不会立即消失,它将等待窗口收集它。这需要一些时间。

更多细节,您可以参考以下代码:

        Process azureP = new Process
        {
            StartInfo =
         {
        FileName = "explorer.exe",
        Arguments = uncPath,
        UseShellExecute = false,

         },
            EnableRaisingEvents = true,
        };

        azureP.Start();

        azureP.WaitForExit();
        //find the open explorer process
        Process[] CurrentProcess1 = Process.GetProcessesByName("explorer");
        int Explorerprocessid = -1;
        foreach (var item in CurrentProcess1)
        {
            if (azureP.StartTime < item.StartTime)
            {
                Console.WriteLine(item.Id);
                Explorerprocessid = item.Id;
            }
        }


        while (true)
        {
            Thread.Sleep(5000);
            Process[] CurrentProcess2 = Process.GetProcessesByName("explorer");
            List<int> l1 = new List<int>();
            foreach (var item in CurrentProcess2)
            {
                l1.Add(item.Id);
            }
            if (l1.Contains(Explorerprocessid))
            {
                Console.WriteLine("Continue");
            }
            else
            {
                //Delete the mount 
                //Process azurePExit = new Process
                //{
                //    StartInfo = new ProcessStartInfo
                //    {
                //        FileName = "net.exe",
                //        Arguments = $"use {uncPath} /delete",
                //        RedirectStandardOutput = true,
                //        RedirectStandardError = true
                //    }
                //};
                Console.WriteLine("Break");
                break;
            }
        }

结果:

1.程序开始运行时:

enter image description here

2.关闭资源管理器后:

enter image description here

答案 1 :(得分:0)

我要感谢@Brando Zhang的回答。本规范运作良好,但我将测试2个解决方案。 Brando Zhang描述的解决方案1,但略有修改将挂载共享,打开共享,获取资源管理器进程,等待它关闭,然后卸载共享。解决方案2将挂载共享,然后打开共享(感谢explorer.exe的工作方式)立即卸载共享。

解决方案1:

            Process netuseP = new Process
            {
                StartInfo = new ProcessStartInfo
                {
                    FileName = "net.exe",
                    Arguments = $"use {uncPath} /u:{username} {password}",
                    RedirectStandardOutput = true,
                    RedirectStandardError = true,
                    UseShellExecute = false,
                }
            };
            netuseP.Start();


            /* --- OPEN THE UNC PATH --- */
            Process azureP = new Process
            {
                StartInfo = {
                    FileName = "explorer.exe",
                    Arguments = uncPath,
                    UseShellExecute = false,
                },
                EnableRaisingEvents = true,
            };
            azureP.Start();


            /* --- WAIT FOR THE PATH TO BE OPENED --- */
            azureP.Exited += ((object proc, EventArgs procE) =>
            {
                /* --- GET THE EXPLORER.EXE PROCESS THAT IS RELATED TO THE AZURE STORAGE ACCOUNT --- */
                Process[] currentExplorers = Process.GetProcessesByName("explorer");
                Process explorerP = null;
                foreach (Process p in currentExplorers)
                {
                    if (azureP.StartTime < p.StartTime)
                    {
                        explorerP = p;
                    }
                }
                if (explorerP != null)
                {
                    explorerP.Exited += ((object eProc, EventArgs eProcE) =>
                    {
                        /* --- DEMOUNT THE FILE SHARE --- */
                        netuseP = new Process
                        {
                            StartInfo = new ProcessStartInfo
                            {
                                FileName = "net.exe",
                                Arguments = $"use {uncPath} /delete",
                                RedirectStandardOutput = true,
                                RedirectStandardError = true,
                                UseShellExecute = false,
                            }
                        };
                        netuseP.Start();
                    });
                }
            });

解决方案2:

            /* --- MAP THE DRIVE --- */
            Process netuseP = new Process
            {
                StartInfo = new ProcessStartInfo
                {
                    FileName = "net.exe",
                    Arguments = $"use {uncPath} /u:{username} {password}",
                    RedirectStandardOutput = true,
                    RedirectStandardError = true,
                    UseShellExecute = false,
                }
            };
            netuseP.Start();


            /* --- OPEN THE UNC PATH --- */
            Process azureP = new Process
            {
                StartInfo = {
                    FileName = "explorer.exe",
                    Arguments = uncPath,
                    UseShellExecute = false,
                },
                EnableRaisingEvents = true,
            };
            azureP.Start();

            /* WAIT FOR WINDOWS TO OPEN THE SHARE */
            System.Threading.Thread.Sleep(2000);


            /* DEMOUNT THE SHARE */
            netuseP = new Process
            {
                StartInfo = new ProcessStartInfo
                {
                    FileName = "net.exe",
                    Arguments = $"use {uncPath} /delete",
                    RedirectStandardOutput = true,
                    RedirectStandardError = true,
                    UseShellExecute = false,
                }
            };
            netuseP.Start();