Dela via


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 konfigurationsarbete. 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 installation 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 EntryPoint-filen 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 exempel på tjänstmanifest 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änstkonfiguration

Som standard körs 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å programmanifestet visas hur du konfigurerar startpunkten för tjänstinstallationen så att den körs under användarkontot (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>

Börja med att skapa ett huvudnamn med ett användarnamn, till exempel SetupAdminUser. SetupAdminUser-användarkontot är medlem i systemgruppen Administratörer.

Under avsnittet ServiceManifestImport konfigurerar du sedan en princip för att tillämpa det här huvudnamnet på SetupEntryPoint. Den här principen anger för Service Fabric att när den MySetup.bat filen körs ska den köras som SetupAdminUser ( med administratörsbehörighet). Eftersom du inte har tillämpat en princip på huvudinmatningspunkten körs koden i MyServiceHost.exe under systemets NetworkService-konto. Det här är standardkontot som alla tjänstinmatningspunkter 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 datorer har användaråtkomstkontroll (UAC) aktiverat som standard. I sådana fall är rekommendationen att köra SetupEntryPoint som LocalSystem, i stället för som en lokal användare som lagts till i gruppen Administratörer. I följande exempel visas inställningen SetupEntryPoint så att den körs 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>

Kommentar

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

Kör 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 filen MySetup.bat 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 det är nyare. Se följande skärmbild.

Visual Studio CopyToOutput för SetupEntryPoint batchfil

Redigera nu MySetup.bat-filen och lägg till följande kommandon som anger en systemmiljövariabel och matar 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

Observera sedan namnet på noden där tjänsten distribuerades och startades i Service Fabric Explorer. Till exempel Nod 2. Gå 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 distribuerades 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

Kommentar

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 filen MySetup.ps1 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 konsolomdirigering

Ibland är det användbart för felsökningsändamål att se konsolens utdata 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, found in C:\SfDeployCluster\_App\{application-name}\log. Du kan se ett nummer 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 programredundansen. Använd endast detta för lokal utveckling och felsökning.

I följande exempel på tjänstmanifest visas hur du ställer in konsolens omdirigering med ett FileRetentionCount-värde:

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

Om du nu ändrar filen MySetup.ps1 för att skriva ett Echo-kommando skrivs den 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