C#编程:Exchange 2010远程电源Shell设置绕过的发件人 [英] C# programming: Exchange 2010 Remote Power Shell setting the bypassed senders

查看:59
本文介绍了C#编程:Exchange 2010远程电源Shell设置绕过的发件人的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图读取与在c#远程的powershell旁路发件人列表,添加一个额外的电子邮件到列表然后远程设置它  权限是精细和它读取列表细群组。

TypeNameOfValue 这是从一开始ContentFilterConfig返回是

Deserialized.Microsoft.Exchange.Data.MultiValuedProperty`1 [Microsoft.Exchange.Data.SmtpAddress,Microsoft.Exchange.Data,版本= 14.0.0.0,培养=中性公钥= 31bf3856ad364e35]]鸟;  

但如果我尝试投值作为(的 <跨度风格= "颜色:#2b91af"> MultiValuedProperty <的 <跨度风格= "颜色:#2b91af"> Smtp地址 >)它总是返回null。

作为一种解决方法,我只需将值转换为字符串并重新创建地址列表。 

当我运行set-ContentFilterConfig命令时,我总是收到错误。

"无法在参数'BypassedSenders'上处理参数转换。无法转换价值\"电子邮件地址... \"键入\" Microsoft.Exchange.Data.MultiValuedProperty`1 [Microsoft.Exchange.Data.SmtpAddress] \"。错误:\"无法转换\"第一个电子邮件地址... \"值类型\" Deserialized.Microsoft.Exchange.Data.SmtpAddress \"键入\" Microsoft.Exchange.Data.SmtpAddress \"。\""

电子邮件地址...和第一个电子邮件地址...是被删除的电子邮件地址从具体的错误信息。

我不知道为什么错误输出,为什么演员阵容不适用于get,以及为什么值集的类型为 <跨度风格=" 颜色:#2b91af "> MultiValuedProperty <的 <跨度风格=" 颜色:#2b91af"> Smtp地址 > 在参数中无效。 感谢任何帮助。


我看过许多"获取"的例子。命令但没有"设置"在powershell中工作的命令。

几乎有效的代码:

公共静态int AddUserToByPassedSenders(字符串电子邮件)
    ;&NBSP;&NBSP;&NBSP;&NBSP; {
&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; VAR connectionInfo =新WSManConnectionInfo(新URI(" HTTPS:/ /mydomain.com/powershell"),"http://schemas.microsoft.com/powershell/Microsoft.Exchange " ;, ExchangeCredential());
&NBSP;&NBSP;&NBSP;&NBSP; &NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; Runspace runspace = RunspaceFactory.CreateRunspace(connectionInfo);
            connectionInfo.AuthenticationMechanism = AuthenticationMechanism.Basic;
            PowerShell powershell = PowerShell.Create();
            var command = new PSCommand();
            command.AddCommand(QUOT;得到-ContentFilterConfig");
&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; powershell.Commands = command;
           尝试
&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; {
&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; runspace.Open();
&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; powershell.Runspace =运行空间;
&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;收集和LT; PSObject>结果= powershell.Invoke();
&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;串bypassedSenders =结果[0] .Members [" BypassedSenders"]。Value.ToString();
&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; &NBSP;&NBSP;&NBSP;如果(!bypassedSenders.Contains(电子邮件))//电子邮件是不是已经在名单
&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP ;&NBSP; {
&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; 。串[] bypassedSendersList = bypassedSenders.ToLower()更换(QUOT;",",")分割( '');。
&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; &NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; //重新创建列表,因为投不工作
&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP ;&NBSP; VAR地址=新MultiValuedProperty< Smtp地址>();
&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP ;&NBSP;的foreach(在bypassedSendersList串EMAILADDRESS)
&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; {
&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP ; addresses.Add(新Smtp地址(EMAILADDRESS));
&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP ;&NBSP; }
&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; addresses.Add(新Smtp地址(电子邮件));
&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP ;&NBSP; VAR命令2 =新PSCommand();
&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; command2.AddCommand(QUOT;设置-ContentFilterConfig");
&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; &NBSP;&NBSP; //添加新的列表中设置
&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP ; command2.AddParameter(QUOT; -BypassedSenders" ;,地址);
&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP ;&NBSP;&NBSP; powershell.Commands.Clear();
&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; powershell.Commands =命令2;
&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; powershell.Invoke();
&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;回报(addresses.Count);

I am trying to read the bypassed senders list with remote powershell in c#, add an additional email to the list then set it remotely.  The permissions are fine and it reads the list fine. 

The TypeNameOfValue  that is returned from the get-ContentFilterConfig is

Deserialized.Microsoft.Exchange.Data.MultiValuedProperty`1[[Microsoft.Exchange.Data.SmtpAddress, Microsoft.Exchange.Data, Version=14.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35]]   

but if I try to cast the value as (MultiValuedProperty<SmtpAddress>) it always returns null.


As a work around I just cast the value to a string and recreate the address list. 

When I run the set-ContentFilterConfig command I always get the error.

"Cannot process argument transformation on parameter 'BypassedSenders'. Cannot convert value \"email addresses...\" to type \"Microsoft.Exchange.Data.MultiValuedProperty`1[Microsoft.Exchange.Data.SmtpAddress]\". Error: \"Cannot convert the \"first email address...\" value of type \"Deserialized.Microsoft.Exchange.Data.SmtpAddress\" to type \"Microsoft.Exchange.Data.SmtpAddress\".\""

email addresses... and first email address... are email addresses that are removed from the specific error message.

I have no idea why it is erroring out, why the cast does not work on the get, and why the value set is of type MultiValuedProperty<SmtpAddress> is not valid in the argument.  Any help is appreciated.

I have seen many examples of "get" commands but no "set" commands that work in powershell.


code that almost works:

 public static int AddUserToByPassedSenders(string email)
        {
            var connectionInfo = new WSManConnectionInfo(new Uri("https://mydomain.com/powershell"),"http://schemas.microsoft.com/powershell/Microsoft.Exchange", ExchangeCredential());
            Runspace runspace = RunspaceFactory.CreateRunspace(connectionInfo);
            connectionInfo.AuthenticationMechanism = AuthenticationMechanism.Basic;
            PowerShell powershell = PowerShell.Create();
            var command = new PSCommand();
            command.AddCommand("get-ContentFilterConfig");
            powershell.Commands = command;
            try
            {
                runspace.Open();
                powershell.Runspace = runspace;
                Collection<PSObject> results = powershell.Invoke();
                string bypassedSenders = results[0].Members["BypassedSenders"].Value.ToString();
                if (!bypassedSenders.Contains(email))//email is not already on the list
                {
                    string[] bypassedSendersList = bypassedSenders.ToLower().Replace(" ", ",").Split(',');
                    //recreate the list because the cast does not work
                    var addresses = new MultiValuedProperty<SmtpAddress>();
                    foreach (string emailaddress in bypassedSendersList)
                    {
                        addresses.Add(new SmtpAddress(emailaddress));
                    }
                    addresses.Add(new SmtpAddress(email));
                    var command2 = new PSCommand();
                    command2.AddCommand("Set-ContentFilterConfig");
                    //add the new list to be set
                    command2.AddParameter("-BypassedSenders", addresses);
                    powershell.Commands.Clear();
                    powershell.Commands = command2;
                    powershell.Invoke();
                    return (addresses.Count);

&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; }
&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; }
&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; catch(例外e)
            {
&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; SendMail.SendErrorMessage(E);
&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; }
&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;最后
&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; {
&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; runspace.Dispose();
&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; powershell.Dispose();
&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; }
&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;返回-1;

                }
            }
            catch (Exception e)
            {
                SendMail.SendErrorMessage(e);
            }
            finally
            {
                runspace.Dispose();
                powershell.Dispose();
            }
            return -1;

        };

        };

推荐答案

查看错误可能是某种序列化/反序列化错误。 

我所做的就是复制所需的DLL版本Microsoft.Exchange.Data.Common.dll
Microsoft.Exchange.Data.Directory.dll
Microsoft.Exchange。 Data.dll
Microsoft.Exchange.Diagnostics.dll
Microsoft.Exchange.Net.dll
System.Management.Automation.dll

来自实际的Exchange 2010服务器所以我可以编译并运行这个项目。

我是否需要序列化和反序列化结果和输入?
Looking at the error it may be some sort of serialization/deserialization error. 

All I did was copy the DLL's needed
Microsoft.Exchange.Data.Common.dll
Microsoft.Exchange.Data.Directory.dll
Microsoft.Exchange.Data.dll
Microsoft.Exchange.Diagnostics.dll
Microsoft.Exchange.Net.dll
System.Management.Automation.dll

from the actual exchange 2010 server so I could compile and run this project.

Do I need to serialize and deserialize the results and inputs?


这篇关于C#编程:Exchange 2010远程电源Shell设置绕过的发件人的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆