Tag: powershell

在x64上没有适用于PowerShell的TFS Snapin吗?

我正在尝试使用PowerShell SDK中的System.Management.Automation从C#代码在PowerShell中使用TFSSnapin,但是我想使用“AnyCPU”编译它。 当我尝试在任何CPU中调试它时,我得到“No Plugins Registered”错误,我尝试在x86模式下调试它并且它工作得很好。 反正有没有在x64 PowerShell上注册插件所以我可以使用AnyCPU? 或者我只是运气不好?

如何克隆Collection ?

我有一个枚举, Fruit和一个类FruitCollection ,它派生Collection 。 我找不到使用.NET克隆FruitCollection方法,我发现这篇MSDN文章定义了一个DeepClone()函数并使用了MemberwiseClone() 。 现在,因为这是一个枚举,我认为我不需要“深入”克隆它,所以我认为MemberwiseClone()就足够了。 但是,当我在PowerShell中尝试它时,克隆的对象似乎只是指向原始对象而不是克隆的指针。 我究竟做错了什么? 还有另一种简单克隆Collection吗? FruitCollection没有其他自定义成员。 C#代码: public enum Fruit { Apple = 1, Orange = 2 } public class FruitCollection : Collection { public FruitCollection Clone() { return Clone(this); } public static FruitCollection Clone(FruitCollection fruitCollection) { return (FruitCollection)fruitCollection.MemberwiseClone(); } } PowerShell输出: PS> $basket1 = New-Object TestLibrary.FruitCollection PS> $basket1.Add([TestLibrary.Fruit]::Apple) PS> […]

从C#调用远程powershell命令

我正在尝试使用C#运行invoke-command cmdlet,但我无法找出正确的语法。 我只想运行这个简单的命令: invoke-command -ComputerName mycomp.mylab.com -ScriptBlock {“get-childitem C:\windows”} 在C#代码中,我做了以下事情: InitialSessionState initial = InitialSessionState.CreateDefault(); Runspace runspace = RunspaceFactory.CreateRunspace(initial); runspace.Open(); PowerShell ps = PowerShell.Create(); ps.Runspace = runspace; ps.AddCommand(“invoke-command”); ps.AddParameter(“ComputerName”, “mycomp.mylab.com”); ps.AddParameter(“ScriptBlock”, “get-childitem C:\\windows”); foreach (PSObject obj in ps.Invoke()) { // Do Something } 当我运行它时,我得到一个例外: Cannot bind parameter ‘ScriptBlock’. Cannot convert the “get-childitem C:\windows” value of type […]

模拟在Powershell中使用WindowsIdentity抛出FileNotFoundException

我在PowerShell和C#中执行模拟遇到了一些奇怪的错误。 执行以下代码不会显示任何错误。 PSObject result = null; using (PowerShell powershell = PowerShell.Create()) { RunspaceConfiguration config = RunspaceConfiguration.Create(); powershell.Runspace = RunspaceFactory.CreateRunspace(config); powershell.Runspace.Open(); powershell.AddScript(String.Format(CmdletMap[PSVocab.OsBootTime], this.ComputerName)); result = powershell.Invoke().First(); powershell.Runspace.Close(); } return DateTime.Parse(result.ToString()); CmdletMap[PSVocab.OsBootTime]的PS脚本只是: $info = Get-WmiObject -Class Win32_OperatingSystem -ComputerName $computer ; $info.ConvertToDateTime($info.LastBootUpTime) 上面的C#代码在本地工作正常。 但是,一旦我使用Windows模拟这样的块,就像这样: WindowsIdentity ImpersonatedIdentity = new WindowsIdentity(ImpersonateUserName); WindowsImpersonationContext impersonatedContext = ImpersonatedIdentity.Impersonate(); try { PSObject result = […]

PowerShell ParameterBindingException

我目前正在构建一个应用程序,以从ASP.NET MVC网站自动执行某些Exchange 2010操作。 现在,当我尝试调用New-AddressList命令时,我遇到了一个ParameterBindingException。 我正在尝试创建以下调用(有效): new-AddressList -Name “7 AL” -RecipientContainer “myDomain.local/Customers/7” -IncludedRecipients ‘AllRecipients’ -Container ‘\’ -DisplayName “7 AL” 我是通过以下方式做到的: var NewAddressList = new Command(“New-AddressList”); NewAddressList.Parameters.Add(“Name”, “7 AL”); NewAddressList.Parameters.Add(“RecipientContainer”, “myDomain.local/Customers/7”); NewAddressList.Parameters.Add(“IncludedRecipients”, “AllRecipients”); NewAddressList.Parameters.Add(“Container”, @”\”); NewAddressList.Parameters.Add(“DisplayName”, “7 AL”); CommandsList.Add(NewAddressList); 此命令列表提供给我调用的管道,给出以下错误: New-AddressList:输入对象不能绑定到命令的任何参数,因为该命令不接受管道输入或输入及其属性与接受管道输入的任何参数都不匹配。 CategoryInfo:InvalidArgument:(7:PSObject)[New-AddressList],ParameterBindingException FullyQualifiedErrorId:InputObjectNotBound,Microsoft.Exchange.Management.SystemConfigurationTasks.NewAddressList 任何可能导致这种情况的线索? 使用Trace-Command输出给出: PS C:\Users\ext_kefu> Trace-Command -Name parameterbinding -Expression {New-AddressList -Name “7 AL” -RecipientContainer “myDomain.local/Customers/7” […]

从.NET调用Powershell时设置启动目录?

我正在使用System.Management.Automation API将PowerShell脚本称为C#WPF应用程序。 在下面的示例中,您将如何更改起始目录($ PWD),以便它从C:\ scripts \执行foo.ps1而不是从它调用的.exe的位置? using (Runspace runspace = RunspaceFactory.CreateRunspace()) { runspace.Open(); using (Pipeline pipeline = runspace.CreatePipeline()) { pipeline.Commands.Add(@”C:\scripts\foo.ps1″); pipeline.Invoke(); } runspace.Close(); }

当由一组信用卡下的计划任务启动的进程在不同的一组Cred下运行另一个程序时,Windows是否有限制

所以我有一个简单的例子,我有app A,它有一些硬编码信用给用户X,一个本地管理员,然后它用这些凭证使用硬编码的绝对路径启动应用B. A和B以及dotnet控制台应用程序,但它们不与控制台交互,只是将信息写入文件。 当我以交互方式运行A(在我的Creds下,通过双击,或通过CMD.exe,或交互式PowerShell会话,它运行正常。成功调用B 当我通过一个计划任务运行它,其中A由于信用不足而且用用户X调用B时,Process.Start(mystartinfo)的错误代码是-1073741502或hex的0xC0000142,这意味着“应用程序无法正确初始化” 但是,如果我运行使用用户X凭据调用A的计划任务,它可以工作.. 我做了这个小测试主要是因为我在PowerShell中从计划任务或远程处理中执行“start-job -Credential”,或者在PowerShell中调用start-process或者在PowerShell中调用System.Diagnostic> Process.Start时看到类似的行为在相同的情况下。 起初我认为这是PowerShell中的一个错误,但它似乎更深。无论是Windows还是特别是Dotnet,我想知道这是否已知/记录,以及是否有任何变通方法。

安全地将加密的标准字符串转换为securestring

我有一个加密的标准字符串,在powershell中通过“convertfrom-securestring”创建并保存到文件中。 后来,我用C#app读取了这个加密的字符串(在相同的用户ID和同一台机器上)。 我想将此加密字符串转换为securestring对象。 在powershell中,可以使用“convertto-securestring”来完成此操作。 如何在c#中安全地做到这一点? 我知道这个答案( 我如何使用ConvertTo-SecureString ), 但它假设已使用已知密钥创建加密字符串 。 这与加密字符串是在没有密钥的情况下创建的情况不同(因此与绑定到用户ID和构造它的机器相关联。) 另请注意,在上述问题的注释中,引用了Microsoft的文档,表明在未提供密钥的情况下使用Windows数据保护API(DPAPI)。 本文( https://msdn.microsoft.com/en-us/library/ms229741(v=vs.110).aspx )展示了如何使用DPAPI,但遗憾的是,它以Microsoft文章中指定的方式使用它结果再次导致字符串在字符串对象中以明文forms出现(我们无法控制,相对于处理),因此以指示的方式使用它将是不安全的。 实际上,这实际上是这个( 如何解密通过PowerShell加密的C#中的字符串 )和我如何使用ConvertTo-SecureString中的问题的组合 。 为了记录,这段代码有效,但我不确定将解密后的字符串存储在字节数组中会出现什么问题,即使我尽快破解它: public static unsafe SecureString MakeSecurityString(string pwd) { int lngth = pwd.Length / 2; byte[] encrypted = new byte[lngth]; for (int i = 0; i < lngth; ++i) { encrypted[i] = byte.Parse(pwd.Substring(2 * i, 2), NumberStyles.HexNumber, […]

如何向管道添加更复杂的Powershell命令

我似乎无法运行像这样的命令…… pshell.AddCommand(“(New-Object -ComObject WScript.Network).AddWindowsPrinterConnection(” + strShare + “)”); …没有收到错误,说它无法找到模块。 它期待我使用类似的东西 pshell.AddCommand(“New-Object”); pshell.AddArgument(“-ComObject”); pshell.Invoke(); 如何在这样的命令中使用该格式?

SQL Server CSV使用SQL Server代理和Powershell导出?

我使用xp_cmdshell找到了这个答案 SQL Server代理作业 – 将结果导出到制表符分隔文件? 这对我来说很好,除了我需要为sql查询提供日期参数。 日期参数通过另一个SQL查询填充。 正在考虑使用PowerShell。 是否有人使用过此方案并愿意共享脚本+体验? 我可以在C#中编写控制台应用程序(或者在我弄清楚如何完成后通过power shell调用的类)。 就在最简单,最杂乱无章的前进之后。 顺便说一下:我最后一次使用xp_cmdshell是因为允许挫折而陷入困境。 上次我不得不教一个系统管理员如何通过电子邮件+这样做也通过电子邮件在不同的时区解决他们的锁定设置。 结果我有一些内在的犹豫;-)。 值得庆幸的是,我在这种情况下获得了自由的统治权。