Köra skript för start av tjänster som ett lokalt konto för användaren eller systemet

Innan en körbar Service Fabric-tjänst startar kan det vara nödvändigt att köra en del konfigurations- eller installationsarbete. Till exempel att konfigurera miljövariabler. Du kan ange ett skript som ska köras innan den körbara tjänsten startar i tjänstmanifestet för tjänsten. Genom att konfigurera en RunAs-princip för startpunkten för tjänstinstallationen kan du ändra vilket konto som den körbara konfigurationen körs under. Med en separat startpunkt för installationen kan du köra högprivilegierad konfiguration under en kort tidsperiod så att den körbara tjänstvärden inte behöver köras med hög behörighet under längre tidsperioder.

Startpunkten för installationen (SetupEntryPoint i tjänstmanifestet) är en privilegierad startpunkt som som standard körs med samma autentiseringsuppgifter som Service Fabric (vanligtvis NetworkService-kontot ) före någon annan startpunkt. Den körbara fil som anges av EntryPoint är vanligtvis den långvariga tjänstvärden. Den körbara Filen EntryPoint körs när den körbara filen SetupEntryPoint avslutas. Den resulterande processen övervakas och startas om och börjar igen med SetupEntryPoint om den någonsin avslutas eller kraschar.

Konfigurera tjänstens konfigurationsstartpunkt

Följande är ett enkelt tjänstmanifestexempel för en tillståndslös tjänst som anger ett installationsskript MySetup.bat i tjänsten SetupEntryPoint. Argument används för att skicka argument till skriptet när det körs.

<?xml version="1.0" encoding="utf-8"?>
<ServiceManifest Name="MyStatelessServicePkg"
                 Version="1.0.0"
                 xmlns="http://schemas.microsoft.com/2011/01/fabric"
                 xmlns:xsd="https://www.w3.org/2001/XMLSchema"
                 xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance">
  <Description>An example service manifest.</Description>
  <ServiceTypes>
    <StatelessServiceType ServiceTypeName="MyStatelessServiceType" />
  </ServiceTypes>

  <!-- Code package is your service executable. -->
  <CodePackage Name="Code" Version="1.0.0">
    <SetupEntryPoint>
      <ExeHost>
        <Program>MySetup.bat</Program>
        <Arguments>MyValue</Arguments>
        <WorkingFolder>Work</WorkingFolder>        
      </ExeHost>
    </SetupEntryPoint>
    <EntryPoint>
      <ExeHost>
        <Program>MyStatelessService.exe</Program>
      </ExeHost>
    </EntryPoint>
  </CodePackage>

  <ConfigPackage Name="Config" Version="1.0.0" />

  <Resources>
    <Endpoints>
      <Endpoint Name="ServiceEndpoint" />
    </Endpoints>
  </Resources>
</ServiceManifest>

Konfigurera principen för en startpunkt för tjänstinstallation

Som standard körs den körbara startpunkten för tjänstinstallationen under samma autentiseringsuppgifter som Service Fabric (vanligtvis NetworkService-kontot ). I programmanifestet kan du ändra säkerhetsbehörigheterna för att köra startskriptet under ett lokalt systemkonto eller ett administratörskonto.

Konfigurera principen med hjälp av ett lokalt systemkonto

I följande exempel på programmanifest visas hur du konfigurerar startpunkten för tjänstinstallationen så att den körs under användarkontot för användaradministratören (SetupAdminUser).

<?xml version="1.0" encoding="utf-8"?>
<ApplicationManifest xmlns:xsd="https://www.w3.org/2001/XMLSchema" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" ApplicationTypeName="MyApplicationType" ApplicationTypeVersion="1.0.0" xmlns="http://schemas.microsoft.com/2011/01/fabric">
  <Parameters>
    <Parameter Name="MyStatelessService_InstanceCount" DefaultValue="-1" />
  </Parameters>
  <ServiceManifestImport>
    <ServiceManifestRef ServiceManifestName="MyStatelessServicePkg" ServiceManifestVersion="1.0.0" />
    <ConfigOverrides />
    <Policies>
      <RunAsPolicy CodePackageRef="Code" UserRef="SetupAdminUser" EntryPointType="Setup" />
    </Policies>
  </ServiceManifestImport>
  <DefaultServices>
    <Service Name="MyStatelessService" ServicePackageActivationMode="ExclusiveProcess">
      <StatelessService ServiceTypeName="MyStatelessServiceType" InstanceCount="[MyStatelessService_InstanceCount]">
        <SingletonPartition />
      </StatelessService>
    </Service>
  </DefaultServices>
  <Principals>
    <Users>
      <User Name="SetupAdminUser">
        <MemberOf>
          <SystemGroup Name="Administrators" />
        </MemberOf>
      </User>
    </Users>
  </Principals>
</ApplicationManifest>

Skapa först ett huvudnamn med ett användarnamn, till exempel SetupAdminUser. Användarkontot SetupAdminUser är medlem i systemgruppen Administratörer.

Under avsnittet ServiceManifestImport konfigurerar du sedan en princip för att tillämpa det här huvudkontot på SetupEntryPoint. Den här principen anger för Service Fabric att när denMySetup.bat filen körs ska den köras som SetupAdminUser ( med administratörsbehörighet). Eftersom du inte har tillämpat en princip på huvudstartpunkten körs koden i MyServiceHost.exe under systemets NetworkService-konto . Det här är standardkontot där alla startpunkter för tjänsten körs som.

Konfigurera principen med hjälp av lokala systemkonton

Ofta är det bättre att köra startskriptet med ett lokalt systemkonto i stället för ett administratörskonto. Att köra RunAs-principen som medlem i gruppen Administratörer fungerar vanligtvis inte bra eftersom användare Access Control (UAC) är aktiverade som standard. I sådana fall rekommenderar vi att du kör SetupEntryPoint som LocalSystem, i stället för som en lokal användare som läggs till i gruppen Administratörer. I följande exempel visas hur du anger att SetupEntryPoint ska köras som LocalSystem:

<?xml version="1.0" encoding="utf-8"?>
<ApplicationManifest xmlns:xsd="https://www.w3.org/2001/XMLSchema" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" ApplicationTypeName="MyApplicationType" ApplicationTypeVersion="1.0.0" xmlns="http://schemas.microsoft.com/2011/01/fabric">
  <Parameters>
    <Parameter Name="MyStatelessService_InstanceCount" DefaultValue="-1" />
  </Parameters>
  <ServiceManifestImport>
    <ServiceManifestRef ServiceManifestName="MyStatelessServicePkg" ServiceManifestVersion="1.0.0" />
    <ConfigOverrides />
    <Policies>
         <RunAsPolicy CodePackageRef="Code" UserRef="SetupLocalSystem" EntryPointType="Setup" />
      </Policies>
  </ServiceManifestImport>
  <DefaultServices>
    <Service Name="MyStatelessService" ServicePackageActivationMode="ExclusiveProcess">
      <StatelessService ServiceTypeName="MyStatelessServiceType" InstanceCount="[MyStatelessService_InstanceCount]">
        <SingletonPartition />
      </StatelessService>
    </Service>
  </DefaultServices>
  <Principals>
      <Users>
         <User Name="SetupLocalSystem" AccountType="LocalSystem" />
      </Users>
   </Principals>
</ApplicationManifest>

Anteckning

Om du vill köra en tjänst eller installationsstartpunkten som rot för Linux-kluster kan du ange AccountType som LocalSystem.

Köra ett skript från startpunkten för installationen

Lägg nu till ett startskript i projektet som ska köras under administratörsbehörighet.

Högerklicka på tjänstprojektet i Visual Studio och lägg till en ny fil med namnet MySetup.bat.

Kontrollera sedan att MySetup.bat-filen ingår i tjänstpaketet. Som standard är det inte det. Välj filen, högerklicka för att hämta snabbmenyn och välj Egenskaper. I dialogrutan Egenskaper kontrollerar du att Kopiera till utdatakatalog är inställt på Kopiera om nyare. Se följande skärmbild.

Visual Studio CopyToOutput för Batch-filen SetupEntryPoint

Redigera nuMySetup.bat-filen och lägg till följande kommandon för att ange en systemmiljövariabel och mata ut en textfil:

REM Set a system environment variable. This requires administrator privilege
setx -m TestVariable %*
echo System TestVariable set to > out.txt
echo %TestVariable% >> out.txt

REM To delete this system variable us
REM REG delete "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v TestVariable /f

Skapa och distribuera sedan lösningen till ett lokalt utvecklingskluster. När tjänsten har startat, som du ser i Service Fabric Explorer, kan du se att MySetup.bat filen lyckades på två sätt. Öppna en PowerShell-kommandotolk och skriv:

PS C:\ [Environment]::GetEnvironmentVariable("TestVariable","Machine")
MyValue

Anteckna sedan namnet på noden där tjänsten distribuerades och startades i Service Fabric Explorer. Till exempel Nod 2. Navigera sedan till arbetsmappen för programinstansen för att hitta den out.txt fil som visar värdet för TestVariable. Om den här tjänsten till exempel har distribuerats till Nod 2 kan du gå till den här sökvägen för MyApplicationType:

C:\SfDevCluster\Data\_App\Node.2\MyApplicationType_App\work\out.txt

Köra PowerShell-kommandon från en startpunkt för installation

Om du vill köra PowerShell från SetupEntryPoint-punkten kan du köra PowerShell.exe i en batchfil som pekar på en PowerShell-fil. Lägg först till en PowerShell-fil i tjänstprojektet, till exempel MySetup.ps1. Kom ihåg att ange egenskapen Kopiera om nyare så att filen också ingår i tjänstpaketet. I följande exempel visas en batchexempelfil som startar en PowerShell-fil med namnet MySetup.ps1, som anger en systemmiljövariabel med namnet TestVariable.

MySetup.bat för att starta en PowerShell-fil:

powershell.exe -ExecutionPolicy Bypass -Command ".\MySetup.ps1"

I PowerShell-filen lägger du till följande för att ange en systemmiljövariabel:

[Environment]::SetEnvironmentVariable("TestVariable", "MyValue", "Machine")
[Environment]::GetEnvironmentVariable("TestVariable","Machine") > out.txt

Anteckning

När batchfilen körs tittar den som standard på programmappen som kallas arbete för filer. I det här fallet, när MySetup.bat körs, vill vi att det här ska hitta den MySetup.ps1 filen i samma mapp, som är programkodpaketmappen . Om du vill ändra den här mappen anger du arbetsmappen:

<SetupEntryPoint>
    <ExeHost>
    <Program>MySetup.bat</Program>
    <WorkingFolder>CodePackage</WorkingFolder>
    </ExeHost>
</SetupEntryPoint>

Felsöka ett startskript lokalt med hjälp av omdirigering av konsolen

Ibland är det användbart för felsökningsändamål att se konsolutdata från att köra ett installationsskript. Du kan ange en omdirigeringsprincip för konsolen på startpunkten för installationen i tjänstmanifestet, som skriver utdata till en fil. Filutdata skrivs till programmappen med namnet log on the cluster node where the application is deployed and run ( Logga in på klusternoden där programmet distribueras och köras) som finns i C:\SfDeployCluster\_App\{application-name}\log. Du kan se ett tal efter programnamnet i sökvägen. Det här antalet ökar för varje distribution. Filerna som skrivs till loggmappen innehåller Code_{service-name}Pkg_S_0.err, som är standardfelutdata och Code_{service-name}Pkg_S_0.out, vilket är standardutdata. Du kan se fler än en uppsättning filer beroende på tjänstaktiveringsförsök.

Varning

Använd aldrig omdirigeringsprincipen för konsolen i ett program som distribueras i produktion eftersom detta kan påverka programmets redundans. Använd endast detta för lokal utveckling och felsökning.

I följande exempel på tjänstmanifest visas hur du ställer in omdirigering av konsolen med värdet FileRetentionCount:

<SetupEntryPoint>
    <ExeHost>
    <Program>MySetup.bat</Program>
    <WorkingFolder>CodePackage</WorkingFolder>
    <ConsoleRedirection FileRetentionCount="10"/>
    </ExeHost>
</SetupEntryPoint>

Om du nu ändrar MySetup.ps1-filen för att skriva ett Echo-kommando skrivs detta till utdatafilen i felsökningssyfte:

Echo "Test console redirection which writes to the application log folder on the node that the application is deployed to"

Varning

När du har felsökt skriptet tar du omedelbart bort den här omdirigeringsprincipen för konsolen.

Nästa steg