Mở một quyền hạn từ xa tùy chỉnh từ xa


1

Tôi có 2 máy tính. Trên máy tính A, tôi có một mô-đun tùy chỉnh được viết bằng C # cho powershell 3.0 và được cài đặt thông qua MSI. Tôi cũng có một phím tắt mở powershell với mô-đun đã được tải.

Tôi chỉ có thể nhấp đúp vào phím tắt và chạy lệnh Do-Something trên máy tính này mà không gặp vấn đề gì, như quyền hạn của Exchange Server.

Nhưng bây giờ tôi muốn làm điều đó từ một phiên từ xa trên máy tính B trong C #.

Vì vậy, câu hỏi của tôi là, làm thế nào tôi có thể mở phiên điều khiển từ xa cho máy tính A với mô-đun của tôi đã được tải và trình bao được cấu hình để tôi có thể chạy lệnh của mình và nhận được kết quả tương tự so với khi tôi chạy nó trên máy tính A?


Bạn đã có một cái nhìn tại psexec?

Không, tôi đã không thử psexec, bạn có thể cho tôi một ví dụ không? Tôi có thể mở một phiên quyền hạn từ xa mà vấn đề không phải là vấn đề là nó chỉ bắt đầu quyền hạn thông thường. Tôi muốn bắt đầu quyền hạn với mô-đun của mình đã được tải nhưng thực hiện nó từ phiên từ xa có thể khó khăn hơn vì tôi không biết đường dẫn cài đặt của mô-đun tại thời điểm này. Tôi đã thấy một số thông tin về PSSessionConfiguration cho phép tập lệnh khởi động nhưng tôi không chắc chắn đó là cách tốt để đi.
Yann Lebel

Câu trả lời:


2

Cuối cùng tôi cũng tìm được cách hoàn thành những gì mình cần.

Đầu tiên tôi tạo một tập lệnh powershell để nhập tập tin mô-đun và tập lệnh mô-đun của tôi

ShellInitScript

function Get-ScriptDirectory
{
    $Invocation = (Get-Variable MyInvocation -Scope 1).Value
    Split-Path $Invocation.MyCommand.Path
}
$MyModuleDirectory = Get-ScriptDirectory
Set-Location $MyModuleDirectory 
Import-Module .\MyModule.psd1

MyModule. Picks1

@{
GUID                = "[GENERATE A GUID HERE]" # Generate using $myGuid = [guid]::NewGuid() 

Author              = "Me"

CompanyName         = "My Company"

Copyright           = "© My Company. All rights reserved."

ModuleVersion       = "1.0.0.0"

ModuleToProcess     = "MyModule.psm1"
}

MyModule.psm1

Import-Module .\MyModuleCSharpAssembly.dll

function Enable-MyShellRemoting([switch]$Force)
{
    $proceed = 0

    if($Force -eq $false)
    {
        Write-Warning "Enable-MyShellRemoting restarts the WinRM service and all dependent services.`r`nAll WinRM sessions connected to Windows PowerShell session configurations are disconnected."

        $title = "Are you sure you want to perform this action?"
        $message = "Performing this operation will allow selected users to remotely run MyModule commands on this computer."

        $yes = New-Object System.Management.Automation.Host.ChoiceDescription "&Yes"

        $no = New-Object System.Management.Automation.Host.ChoiceDescription "&No"

        $options = [System.Management.Automation.Host.ChoiceDescription[]]($yes, $no)

        $proceed = $Host.UI.PromptForChoice($title, $message, $options, 0) 
    }

    if($proceed -eq 0)
    {
        Enable-PSRemoting -Force

        if((Get-WmiObject Win32_ComputerSystem).PartOfDomain -eq $false){
            Set-Item WSMan:\localhost\Client\TrustedHosts *
            Restart-Service WinRM
        }

        $path = Join-Path -Path $MyModuleDirectory  -ChildPath "ShellInitScript.ps1"
        Register-PSSessionConfiguration -Name "MyShellUri" -StartupScript $path -Force
    }
}
function Disable-MyShellRemoting([switch]$Force, [switch]$DisablePSRemoting)
{
    $proceed = 0

    if($Force -eq $false)
    {
        Write-Warning "Disable-MyShellRemoting restarts the WinRM service and all dependent services.`r`nAll WinRM sessions connected to Windows PowerShell session configurations are disconnected."

        $title = "Are you sure you want to perform this action?"
        $message = "Performing this operation will prevent all users to remotely run MyModule commands on this computer.`r`nUse the the -DisablePSRemoting switch to disable all PowerShell remoting features."

        $yes = New-Object System.Management.Automation.Host.ChoiceDescription "&Yes"

        $no = New-Object System.Management.Automation.Host.ChoiceDescription "&No"

        $options = [System.Management.Automation.Host.ChoiceDescription[]]($yes, $no)

        $proceed = $Host.UI.PromptForChoice($title, $message, $options, 0) 
    }

    if($proceed -eq 0)
    {
        if($DisablePSRemoting)
        {
            Disable-PSRemoting
        }

        if((Get-PSSessionConfiguration -Name "MyShellUri" -ErrorAction SilentlyContinue) -eq $null){
            Write-Host "The session configuration MyShellUri is already unregistered."
        }
        else {        
            Unregister-PSSessionConfiguration -Name "MyShellUri" -Force -ErrorAction Ignore
        }
    }
}

function Test-MyShellRemote()
{
    return "Test completed"
}

MyModuleCSharpAssugging.dll dll chỉ là một tập hợp .Net thông thường có chứa các lệnh ghép ngắn tùy chỉnh.

Giải pháp cho vấn đề nằm ở chức năng Enable-MyShellRemot phương thức này cho phép điều khiển từ xa powershell và đăng ký Cấu hình phiên Powershell tùy chỉnh với tập lệnh statup tải mô-đun.

Sau đó, trong C #, tất cả những gì chúng ta phải làm là chỉ định ShellUri trong đối tượng kết nối như thế này

WSManConnectionInfo connectionInfo = new WSManConnectionInfo();
connectionInfo.ComputerName = "MyComputer";
connectionInfo.ShellUri = "http://schemas.microsoft.com/powershell/MyShellUri";
using (Runspace remoteRunspace = RunspaceFactory.CreateRunspace(connectionInfo))
{
     remoteRunspace.Open();
     using (PowerShell shell = PowerShell.Create())
     {
          shell.Runspace = remoteRunspace;
          shell.AddCommand("Test-MyShellRemote");
          Collection<PSObject> results = shell.Invoke();
          //the results collection contains the string return by the command
     }
     remoteRunspace.Close();
 }

Bạn có thể sử dụng [guide] :: NewGuid () sau đó sao chép và dán hướng dẫn đã tạo. Hướng dẫn này phải luôn giống nhau cho mô-đun của bạn.
Yann Lebel

ShellInitScript có thể được bao gồm trong profile.ps1 không?
Kiquenet

Có, nhưng trong trường hợp này, mô-đun sẽ được tải trong tất cả bảng điều khiển quyền hạn của người dùng nhưng nếu bạn tách chúng ra, bạn có thể tạo một lớp vỏ tách biệt giống như Exchange Server Shell.
Yann Lebel
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.