简体   繁体   中英

How can I map a network drive from a Windows Service

I have a windows service (C#) running as Local System. I want to be able to read my database and run PowerShell commands and scripts. I am able to run most scripts but my test machine is hanging on this one:

NET USE Z: /Delete /y
NET USE Z: \\TEST2\ProgramData

I can run these commands on the computer and it all works but when I try to run these commands from within my Windows Service it hands on the line which runs the script.

    private static bool RunPSCommand(string command, out string output)
    {
        // create Powershell runspace
        Runspace runspace = RunspaceFactory.CreateRunspace();

        // open it
        runspace.Open();

        // create a pipeline and feed it the script text
        Pipeline pipeline = runspace.CreatePipeline();
        pipeline.Commands.AddScript(command);

        // add an extra command to transform the script output objects into nicely formatted strings
        // remove this line to get the actual objects that the script returns. For example, the script
        // "Get-Process" returns a collection of System.Diagnostics.Process instances.
        pipeline.Commands.Add("Out-String");

        // execute the script
        try
        {
            StringBuilder stringBuilder = new StringBuilder();

            Collection<PSObject> results = pipeline.Invoke();
            if (pipeline.HadErrors)
            {
                var errors = pipeline.Error.ReadToEnd();
                foreach (object error in errors)
                {
                    stringBuilder.AppendLine(error.ToString());
                }
            }

            // close the runspace
            runspace.Close();

            // convert the script result into a single string        
            foreach (PSObject obj in results)
            {
                stringBuilder.AppendLine(obj.ToString());
            }

            output = stringBuilder.ToString();
            return true;
        }
        catch (CommandNotFoundException e)
        {
            output = e.Message;
            return false;
        }

        catch (Exception e)
        {
            output = e.Message;
            return false;
        }
    }

I am not sure why this is so difficult. I have been wracking my head on this one for three days and trying every option from net use to DOM objects

NET USE Z: /Delete /y
(New-Object -Com WScript.Network).MapNetworkDrive("z:" , "\\test2\programdata")

I was attempting to do this from a service but switched to an application running on a user session. It works this way.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM