2008-08-27 18 views
2

Üzerinde çalıştığım bir MSI dağıtımıyla ilgili bir sorunum var (InstallShield kullanarak). Kullanıcı başına çalışması gereken arka planda çalışan bir programımız var ve kullanıcı müdahalesi olmadan otomatik olarak başlatılması gerekiyor.MSI, SISTEM bağlamında bir EXE başlatmasını durdurma

Sorun, Group Policy Object/Active Directory (GPO/AD) dağıtımı ile uygulama oturum açmak üzere olan kullanıcı yerine giriş yapmadan önce sistem bağlamında SİSTEM bağlamında başlatılır. Uygulama yalnızca kullanıcı başına bir kez çalıştırılabilir ve öyle görünüyor ki SİSTEM süreci, KULLANICI işleminin başlatılmasını engelliyor. Bu, yazılımların kullanıcılara dağıtılmasından önce bilgisayarların iki kez yeniden başlatılması gerektiği anlamına gelir. Bunu nasıl durduracağız?

Temelde geçerli iş akışı:

  1. Kurulum/Install arka plan uygulamayı öldürmek ...
  2. çalışır yükseltme yeni dosyalar
  3. Başlangıç ​​arkaplan uygulaması
  4. Bu yayınlanmış uygulamalar için çalışır

ve Etkileşimli MSI yüklemeleri - sorunu olan sadece 'atanmış' uygulamalar. 3. adım, SISTEM bağlamında kullanıcı bağlamı yerine gerçekleştiği için :(

İdeal olarak, SISTEM bağlamında başlatma işlemini engellemek için geliştirme ekibinin EXE dosyasını yamasını getirmesi gerekir, ancak bu bir sürüm döngüsüdür ve m

. bu arada bir yükleyici tabanlı çözüm arayan (... Ben InstallScript bilmiyorum Yani VBScript tahmin ediyorum muhtemelen kullanabilirsiniz hiçbir yerli InstallShield şeyler varsa gitmek yoludur.)

cevap

5

Windows Installer'ın LogonUser özelliğini, EXE'i başlatan eylemin bir koşulu olarak kullanabilirsiniz

+0

Sadece bunu en son sürümümüzde ekledim (aşağıdaki kodu değiştiriyorum) - Bir çekicilik gibi çalışır! Bunu daha ayrıntılı olarak açıklayabiliyorsanız, teşekkürler :) – saschabeaumont

+1

harika olurdu. –

1

AHA! Orada tanıdığım bir temizleyici çözüm olmak zorunda ... Ben üzerinde çalışıyordu Kod şöyle görünmeye başlamıştı:

On Error Resume Next 
strComputer = "." 
Set objWMIService = GetObject("winmgmts:" _ 
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2") 
Set colProcessList = objWMIService.ExecQuery _ 
    ("Select * from Win32_Process Where Name = 'BackgroundProcess.exe'") 
For Each objProcess in colProcessList 
    colProperties = objProcess.GetOwner(strNameOfUser,strUserDomain) 
    If strNameOfUser = "SYSTEM" Then  
     objProcess.Terminate() 
    End If 
Next 
1

Bunu başarmak için bir Windows yükleyici özelliği güvenmek olmaz. Eğer doğru bir şekilde anlarsam, kullanıcı başına bir kez bir EXE dosyası çalıştırmak istersiniz - muhtemelen kullanıcı varsayılanlarını ayarlamak ister misiniz? Doğru bağlamda olduğunuzu garanti edebileceğiniz tek zaman, kullanıcının gerçekten oturum açtığı zamandır. Ortalama dağıtım senaryosunda bu günlerde gerçekleşen taklitçilik miktarı ile sadece bir şeye güvenmiyorum ama gerçek kullanıcı girişi doğru EXE dosyalarını çalıştırmak için sahne.

Orada çok fazla sorun kaynaklar şunlardır: kayıt vb yazıyor için

Microsoft adında bir özelliği vardır ... özel izin ve ayrıcalık lockdowns terminal sunucusu kilitleme, sanallaştırma yönlendirir, kimliğe bürünme dağıtım sistemi tarafından işletilen, işletim sistemi geçersiz kılmaları Oturum açma sırasında kullanıcı başına bir kez "çalıştırılabilir bir şey" çalıştırmanıza izin veren Aktif Kurulum. Bu, bir komut dosyasından yürütülebilir bir dosyaya kadar her şey olabilir. Daha fazla bilgi için cevabımı buraya bakın: Updating every profile's registry on Windows Server 2003

İlgili konular