none
Dienst Starten auf lokalem PC mit anderen Rechten. (In VB.NET integriert) RRS feed

  • Frage

  • Hallo liebe Gemeinde,

    Ich schreibe eine lib mit der es möglich sein soll, Dienste zu starten und zu beenden. Es handelt sich sowohl um lokale, als auch um Dienste auf remote PCs. Das ganze läuft später über eine Weboberfläche.

    beim Starten und Beenden von remote Diensten habe ich keine Probleme, da ich dazu das WMI Objekt nutze und dem die benötigten Credentials anhängen kann. Das WMI Objekt akzeptiert jedoch die Credentials nicht, wenn ich einen lokalen Dienst steuern möchte. Wenn der VB.NET Code meine Powershell Anweisungen ausführt, passiert dieses leider nicht mit Admin Rechten. Wie kann ich nun sagen, dass es trotz lokalem Zugriff die Admin Rechte nutzen soll?

    Mein Script:

    $username = 'Username'
    $pw = convertto-securestring 'Passwort' -asplaintext -force
    $computername = 'ComputerName' 
    $server = gc env:computername
    $cred = new-object -typename System.Management.Automation.PSCredential -argumentlist $username, $pw
    
    #Wenn der Dienst auf dem gleichen Server läuft, wie der Server auf dem das Script ausgeführt wird ohne Credentials machen
    if ( $computername.Contains($server)){
    (Get-WmiObject -class Win32_Service -filter "name='Dienstname'").startservice().returnvalue
    } 
    else {
    (Get-WmiObject -class Win32_Service -ComputerName $computername -Credential $cred -filter "name='Dienstname'").startservice().returnvalue
    }

    kann mir jemand helfen?

    Dienstag, 30. Oktober 2012 09:40

Antworten

  • Das ist ein WMI "Fehler" und hat mit PowerShell nichts zu tun!

    Ich nutze dazu PowerShell Remoting mit dem Invoke-Command. Somit komme verbinde ich mich von "aussen" zu dem lokalen rechner ;-)

    Dazu muss der Lokale rechner natürlich mit PowerShell Remoting erreichbar sein.

    $DienstName = 'BITS'
    $username = 'Name'
    $pw = convertto-securestring 'PWD' -asplaintext -force
    $computername = $env:computername
    $server = $env:computername
    $cred = new-object -typename System.Management.Automation.PSCredential -argumentlist $username, $pw
    
    #Wenn der Dienst auf dem gleichen Server läuft, wie der Server auf dem das Script ausgeführt wird ohne Credentials machen
    if ( $computername -Like $server){
        Invoke-Command -ComputerName $computername -Credential $cred -ArgumentList $Dienstname -ScriptBlock {(Get-WmiObject -class Win32_Service -filter ("name='" + $args[0] + "'")).startservice().returnvalue}
    } 
    else {
        (Get-WmiObject -class Win32_Service -ComputerName $computername -Credential $cred -filter $("name='" + $DienstName + "'")).startservice().returnvalue
    }


    Please click “Mark as Answer” if my post answers your question and click “Vote As Helpful” if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als “Als Hilfreich bewerten” und Beiträge die deine Frage ganz oder teilweise beantwortet haben als “Als Antwort markieren”.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
    German ? Come to German PowerShell Forum!


    • Bearbeitet Peter Kriegel Dienstag, 30. Oktober 2012 12:45
    • Als Antwort markiert Naboru Dienstag, 30. Oktober 2012 13:15
    Dienstag, 30. Oktober 2012 12:44
  • Es gibt diverse Möglichkeiten: bei einem "normalen" Script könnte man selbiges mit Adminrechten neu starten. (siehe z.b. hier). Du kannst auch eine neue Powershell mit dem entsprechenden Kommando starten:

    $service = "myservice"
      
    $process = "powershell.exe"
    $prci = new-object System.Diagnostics.ProcessStartInfo $process
    $prci.Arguments = " -command  `"(Get-WmiObject -class Win32_Service | where-object { `$_.name -eq  \`"$service\`" }).startservice() "
    $prci.Verb = "runas" 
    $prci.WorkingDirectory = get-location;
    [void][System.Diagnostics.Process]::Start($prci);
    
    sleep 1
    (Get-Service $service).Status

    Die große Unbekannte hier ist aber "Wenn der VB.NET Code meine Powershell Anweisungen ausführt". Außerdem, falls die UAC auf dem Rechner aktiv ist, musst du diese entweder deaktivieren oder manuell bestätigen.
    Aber ich werde das Gefühl nicht los, das es das einfachste sein dürfte, einfach die VB-net-Hostanwendung mit Adminrechten zu starten.
     

    Grüße, Denniver


    Blog: http://bytecookie.wordpress.com

    Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".


    Dienstag, 30. Oktober 2012 12:46
    Moderator

Alle Antworten

  • Das ist ein WMI "Fehler" und hat mit PowerShell nichts zu tun!

    Ich nutze dazu PowerShell Remoting mit dem Invoke-Command. Somit komme verbinde ich mich von "aussen" zu dem lokalen rechner ;-)

    Dazu muss der Lokale rechner natürlich mit PowerShell Remoting erreichbar sein.

    $DienstName = 'BITS'
    $username = 'Name'
    $pw = convertto-securestring 'PWD' -asplaintext -force
    $computername = $env:computername
    $server = $env:computername
    $cred = new-object -typename System.Management.Automation.PSCredential -argumentlist $username, $pw
    
    #Wenn der Dienst auf dem gleichen Server läuft, wie der Server auf dem das Script ausgeführt wird ohne Credentials machen
    if ( $computername -Like $server){
        Invoke-Command -ComputerName $computername -Credential $cred -ArgumentList $Dienstname -ScriptBlock {(Get-WmiObject -class Win32_Service -filter ("name='" + $args[0] + "'")).startservice().returnvalue}
    } 
    else {
        (Get-WmiObject -class Win32_Service -ComputerName $computername -Credential $cred -filter $("name='" + $DienstName + "'")).startservice().returnvalue
    }


    Please click “Mark as Answer” if my post answers your question and click “Vote As Helpful” if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als “Als Hilfreich bewerten” und Beiträge die deine Frage ganz oder teilweise beantwortet haben als “Als Antwort markieren”.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
    German ? Come to German PowerShell Forum!


    • Bearbeitet Peter Kriegel Dienstag, 30. Oktober 2012 12:45
    • Als Antwort markiert Naboru Dienstag, 30. Oktober 2012 13:15
    Dienstag, 30. Oktober 2012 12:44
  • Es gibt diverse Möglichkeiten: bei einem "normalen" Script könnte man selbiges mit Adminrechten neu starten. (siehe z.b. hier). Du kannst auch eine neue Powershell mit dem entsprechenden Kommando starten:

    $service = "myservice"
      
    $process = "powershell.exe"
    $prci = new-object System.Diagnostics.ProcessStartInfo $process
    $prci.Arguments = " -command  `"(Get-WmiObject -class Win32_Service | where-object { `$_.name -eq  \`"$service\`" }).startservice() "
    $prci.Verb = "runas" 
    $prci.WorkingDirectory = get-location;
    [void][System.Diagnostics.Process]::Start($prci);
    
    sleep 1
    (Get-Service $service).Status

    Die große Unbekannte hier ist aber "Wenn der VB.NET Code meine Powershell Anweisungen ausführt". Außerdem, falls die UAC auf dem Rechner aktiv ist, musst du diese entweder deaktivieren oder manuell bestätigen.
    Aber ich werde das Gefühl nicht los, das es das einfachste sein dürfte, einfach die VB-net-Hostanwendung mit Adminrechten zu starten.
     

    Grüße, Denniver


    Blog: http://bytecookie.wordpress.com

    Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".


    Dienstag, 30. Oktober 2012 12:46
    Moderator
  • Danke, läuft super :) im Nachhinein hätte ich auch selber drauf kommen können.
    Dienstag, 30. Oktober 2012 13:15
  • Wenn du WMI benutzt läuft das Remoting meistens (immer) über den RPC Service das heisst es wird DCOM benutzt!
    Dies ist schwierig wenn Firewalls dazwischen sind!!!!
    Deshalb empfehle ich dir, das du nur PowerShell remoting nimmst, wenn alle Rechner darauf eingestellt sind!
    PowerShell Remoting (WSMAN) läuft über HTTP(S) und ist dadurch besser bei Firewalls!
    Somit kannst du dann die WMI Klasse vergessen und das Cmdlet Start-Service nutzen!

    Please click “Mark as Answer” if my post answers your question and click “Vote As Helpful” if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als “Als Hilfreich bewerten” und Beiträge die deine Frage ganz oder teilweise beantwortet haben als “Als Antwort markieren”.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
    German ? Come to German PowerShell Forum!

    Dienstag, 30. Oktober 2012 14:49