简体   繁体   中英

Error while executing Exchange powershell commands from C# program

I tried the following code to get the mailbox from an exchange server.I am encountering issue while running the program

static void Main(string[] args)
{
   string user = "Domain\\username";
   SecureString passwd = new SecureString();
   foreach (char c in "Password")
   {
        passwd.AppendChar(c);
   }
   PSCredential cred = new PSCredential(user, passwd);
   WSManConnectionInfo ConnInfo = new WSManConnectionInfo(new Uri(liveIdconnectionUri), "http://schemas.microsoft.com/powershell/Microsoft.Exchange", cred);
   ConnInfo.AuthenticationMechanism = AuthenticationMechanism.Kerberos;
   ConnInfo.MaximumConnectionRedirectionCount = 2;
   //ConnInfo.ProxyAccessType = System.Management.Automation.Remoting.ProxyAccessType.AutoDetect;
   Runspace ExchangeRunspace = System.Management.Automation.Runspaces.RunspaceFactory.CreateRunspace(ConnInfo);
   PowerShell powershell = PowerShell.Create();
   PSCommand command = new PSCommand();
   command.AddCommand("Get-Mailbox");
   command.AddParameter("Identity", user);
   powershell.Commands = command;
   // open the remote runspace
   ExchangeRunspace.Open();
   // associate the runspace with powershell
   powershell.Runspace = ExchangeRunspace;
   // invoke the powershell to obtain the results
   powershell.Invoke();
   Collection<PSObject> results = powershell.Invoke();

   foreach (PSObject obj in results)
   {
        PSMemberInfoCollection<PSPropertyInfo> propInfos = obj.Properties;
        Console.WriteLine("********************");
        foreach (PSPropertyInfo propInfo in propInfos)
        {
            string propInfoValue = (propInfo.Value == null) ? "" : propInfo.Value.ToString();
            Console.WriteLine("{0} --> {1}", propInfo.Name, propInfoValue);
        }


    }
    Console.ReadLine();
}

I get the following error while running the above code

Connecting to remote server failed with the following error message : WinRM cannot process the request. The following error occured while using Kerberos authentication: There are currently no logon servers available to service the logon request.  
 Possible causes are:
  -The user name or password specified are invalid.
  -Kerberos is used when no authentication method and no user name are specified.
  -Kerberos accepts domain user names, but not local user names.
  -The Service Principal Name (SPN) for the remote computer name and port does not exist.
  -The client and remote computers are in different domains and there is no trust between the two domains.
 After checking for the above issues, try the following:
  -Check the Event Viewer for events related to authentication.
  -Change the authentication method; add the destination computer to the WinRM TrustedHosts configuration setting or use HTTPS transport.
 Note that computers in the TrustedHosts list might not be authenticated.
   -For more information about WinRM configuration, run the following command: winrm help config. For more information, see the about_Remote_Troubleshooting Help topic."

Even when I run the command 'New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri $liveIdconnectionUri -credential "user@example.com" -authentication kerberos', I get the same error.

Any pointer to solve this would be really helpful.Thanks in advance.

Without having access to the system it would be hard to give you an exact cause. Some things I would try:

* Ensure you have remoting set up correctly and that WSMAN exceptions are present in the firewall. Try running "winrm quickconfig".

* Ensure that you have setup the correct remote script execution policy for the server. See (Get/Set)-ExecutionPolicy

* Make sure the proper domain credentials are being passed and that it can be authenticated from the target computer to the domain ctrlr.

            string username = "Hitesh";
            string password = "Shrimali";
            string sSAMAccount = "SAMAccountName"; //here Also you can use Your emailAddress

            var lyncPW = GetSecurePassword(password);

            PSCredential creds = new PSCredential(username, lyncPW);
            Runspace m_RunSpace = RunspaceFactory.CreateRunspace();
            PowerShell powershell = PowerShell.Create();
            m_RunSpace.Open();


            PSCommand CmdCredential = new PSCommand();
            CmdCredential.AddCommand("Get-Credential");
            CmdCredential.AddParameter("Credential", creds);
            powershell.Commands = CmdCredential;
            powershell.Runspace = m_RunSpace;
            powershell.Invoke();


            PSCommand command = new PSCommand();
            command.AddCommand("New-PSSession");
            command.AddParameter("ConfigurationName", "Microsoft.Exchange");
            command.AddParameter("ConnectionUri", "YourURL/PowerShell/"); //Your Exchange URL
            command.AddParameter("Credential", creds);
            command.AddParameter("Authentication", "Default");
            powershell.Commands = command;
            powershell.Runspace = m_RunSpace;
            powershell.Invoke();


            PSSessionOption sessionOption = new PSSessionOption();
            sessionOption.SkipCACheck = true;
            sessionOption.SkipCNCheck = true;
            sessionOption.SkipRevocationCheck = true;
            command.AddParameter("SessionOption", sessionOption);
            powershell.Commands = command;
            powershell.Runspace = m_RunSpace;

            Collection<PSSession> result = powershell.Invoke<PSSession>();
            PSSession ps = result.FirstOrDefault();

            RunspaceInvoke runSpaceInvoker = new RunspaceInvoke(m_RunSpace);
            runSpaceInvoker.Invoke("Set-ExecutionPolicy Unrestricted -Scope CurrentUser");


            PSCommand cmdImportSession = new PSCommand();
            cmdImportSession.AddCommand("Import-PSSession");
            cmdImportSession.AddParameter("Session", ps);
            cmdImportSession.AddParameter("AllowClobber", true);
            powershell.Commands = cmdImportSession;
            powershell.Runspace = m_RunSpace;
            powershell.Invoke();


            PSCommand cmdNewMoveRequest = new PSCommand();
            cmdNewMoveRequest.AddCommand("New-MoveRequest");
            cmdNewMoveRequest.AddParameter("Identity", sSAMAccount);
            cmdNewMoveRequest.AddParameter("TargetDatabase", "BoxerProperty Disabled Users Mailbox Database");
            powershell.Commands = cmdNewMoveRequest;
            powershell.Runspace = m_RunSpace;
            powershell.Invoke();


            foreach (ErrorRecord current in powershell.Streams.Error)
            {
                // log errors
            }

            m_RunSpace.Close();

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