gpt4 book ai didi

c# - Powershell 和 C# 中的此运行空间不支持语法

转载 作者:太空狗 更新时间:2023-10-29 23:24:51 25 4
gpt4 key购买 nike

我正在尝试使用集成到 C# 中的 power shell 获取有关我的用户邮箱的信息,但出现以下错误:

This syntax is not supported by this run space. This might be because it is no-language mode.

这是我使用的代码:

using System;
using System.Collections.ObjectModel;
using System.Collections;
using System.Linq;
using System.Text;
using System.Management.Automation;
using System.Management.Automation.Runspaces;
using System.Threading;
using System.Globalization;

namespace Office365
{
class Program
{
static void Main(string[] args)
{
CultureInfo oldCI = Thread.CurrentThread.CurrentCulture;
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-US");
Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US");

System.Security.SecureString secureString = new System.Security.SecureString();
string myPassword = "mySecretPassword";
foreach (char c in myPassword)
secureString.AppendChar(c);
PSCredential credential = new PSCredential("my@maildomain.com", secureString);
Console.WriteLine("Forbinder....");
WSManConnectionInfo connectionInfo = new WSManConnectionInfo(new Uri("https://ps.outlook.com/PowerShell-LiveID?PSVersion=2.0"), "http://schemas.microsoft.com/powershell/Microsoft.Exchange", credential);
connectionInfo.AuthenticationMechanism = AuthenticationMechanism.Basic;
connectionInfo.SkipCACheck = true;
connectionInfo.SkipCNCheck = true;

string cmd2 = @"Get-Mailbox | Select-object Identity, displayname, ProhibitSendReceiveQuota, @{n='size';e={$MBXSTAT=Get-MailboxStatistics $_.Identity; $MBXSTAT.TotalItemSize}}";

using (Runspace runspace = RunspaceFactory.CreateRunspace(connectionInfo))
{

runspace.Open();

using (Pipeline pipeline = runspace.CreatePipeline(cmd2))
{
pipeline.Commands.AddScript(cmd2);
Collection<PSObject> results = pipeline.Invoke();
foreach (PSObject obj in results)
{

// Do something with each result object
}
}
}
}
}

对此有什么建议吗?我该如何克服这个问题?

最佳答案

通常我喜欢让死者独自一人,但在这种情况下,我觉得有必要恢复这篇旧帖子,因为我遇到了确切的问题,需要一个地方来保存这段代码,希望这可以防止其他人浪费太多时间。

我发现使用 WSManConnectionInfo 连接到 O365 有问题,在浪费了太多时间试图让它工作之后我不会使用它,除非我别无选择。

也就是说,以下代码对我有效,并且其行为与我打开 PowerShell 提示输入我要运行的命令一样:) 它使测试变得更加简单。

using (var _power_shell = PowerShell.Create()) {
_power_shell.AddScript("Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope Process");
_power_shell.Invoke();<br/>
var credential = new PSCredential(username, password.ToSecureString());
_power_shell.Runspace.SessionStateProxy.SetVariable("Credential", credential);<br/>
_power_shell.AddScript("$Session = New-PSSession –ConfigurationName Microsoft.Exchange -ConnectionUri <a href="https://ps.outlook.com/powershell" rel="noreferrer noopener nofollow">https://ps.outlook.com/powershell</a> -Credential
$Credential -Authentication Basic -AllowRedirection");
_power_shell.AddScript("Import-PSSession $Session");
_power_shell.Invoke();<br/>
_power_shell.AddScript("Get-Mailbox -RecipientTypeDetails RoomMailbox | Select-Object DisplayName, PrimarySmtpAddress");
var results = _power_shell.Invoke();<br/>
foreach (var obj in results)
{
/* Do something with the results */
}<br/>
_power_shell.AddScript("Remove-PSSession $Session");
_power_shell.Invoke();
}

上面的代码假设username & password 是已经在范围内的字符串变量。还有一个扩展方法 ToSecureString 存在并且在范围内。

据我所知,PowerShell.Creste() 提供了一个设置为 Restricted 的执行环境,因此您首先需要更改它。在这种情况下,因为我们将 Set-ExecutionPolicy 的范围限定为进程不需要管理员权限。

根据我在该主题上的少量发现,您似乎需要在完成后删除 session ,否则您可能会受到限制并将自己锁定在 O365 之外一段时间。

关于c# - Powershell 和 C# 中的此运行空间不支持语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12316952/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com