Hizmet tarafından kullanılacak bir ağ sürücüsünü eşleme


213

Bazı Windows hizmetlerinin eşlenmiş ağ sürücüleri isteyen ve UNC yolu gerektirmeyen kod kullandığını varsayalım. Hizmet başlatıldığında sürücü eşlemesini hizmetin oturumuna nasıl sunabilirim? Hizmet kullanıcısı olarak oturum açmak ve kalıcı bir eşleme oluşturmak, eşlemeyi gerçek hizmet bağlamında oluşturmaz.


6
Bakınız ForcePush'ın cevabı, geçici çözümü işe yarıyor.
Ubikuity

Yanıtlar:


44

Hizmeti değiştirmeniz veya yardımcı bir işlemin içine sarmanız gerekir: oturum / sürücü erişim sorunlarının yanı sıra, kalıcı sürücü eşleştirmeleri yalnızca hizmetlerin genellikle gerçekleştirmediği etkileşimli bir oturum açma işleminde geri yüklenir.

Yardımcı işlem yaklaşımı oldukça basit olabilir: sadece sürücüyü eşleyen ve 'gerçek' hizmeti başlatan yeni bir hizmet oluşturun. Bu konuda tamamen önemsiz olmayan tek şey:

  • Yardımcı hizmetin tüm uygun SCM komutlarını (başlat / durdur vb.) Gerçek hizmete iletmesi gerekir. Gerçek hizmet özel SCM komutlarını kabul ederse, bunları da iletmeyi unutmayın (UNC yollarını bu tür komutları kullanmak için egzotik kabul eden bir hizmet beklemiyorum ...)

  • İşler biraz aldatıcı olabilir. Gerçek hizmet normal bir kullanıcı hesabı altında çalışıyorsa, yardımcı hizmeti bu hesap altında da çalıştırabilirsiniz ve hesabın ağ paylaşımına uygun erişimi olduğu sürece her şey yolunda olmalıdır. Gerçek hizmet yalnızca LOCALSYSTEM veya daha fazlası olarak çalıştığında çalışacaksa, işler daha ilginç hale gelir, çünkü ağ sürücüsünü hiç göremez veya işlerin çalışması için bazı kimlik bilgileri hokkabazlığı gerektirmez.


2
Çok bilgilendirici ... Oturum açma komut dosyalarının hizmet oturumları için değil, yalnızca etkileşimli oturumlar için de çalıştığını varsayarak doğru muyum?
VoidPointer

220

Bunu kullanmak kendi sorumluluğunuzdadır. (XP ve Server 2008 x64 R2 üzerinde test ettim)

Bu kesmek için Mark Russinovich tarafından SysinternalsSuite'a ihtiyacınız olacak :

Birinci adım: Yükseltilmiş bir cmd.exe istemi açın (Yönetici olarak çalıştır)

İkinci adım: SysinternalsSuite içeren ve aşağıdaki komutu çalıştırmak klasöre Şuraya: Elevate tekrar PSExec.exe kullanarak köküne psexec -i -s cmd.exe Artık içeri bir istem ait olduğunu vardır nt authority\systemve siz yazarak bu kanıtlayabilirim whoami. -iSürücü dönüşümler kullanıcı ile etkileşime girerek gerektiğinden gereklidir

Üçüncü Adım: Aşağıdaki komutla kalıcı eşlenmiş sürücüyü SYSTEM hesabı olarak oluşturun net use z: \\servername\sharedfolder /persistent:yes

İşte bu kadar kolay!

UYARI : Bu eşlemeyi yalnızca oluşturduğunuz şekilde SYSTEM hesabından kaldırabilirsiniz. Kaldırmanız gerekirse, 1. ve 2. adımları izleyin, ancak 3. adımdaki komutu olarak değiştirin net use z: /delete.

NOT : Yeni oluşturulan eşlenen sürücü artık bu sistemin TÜM kullanıcıları için görünecek, ancak "Bağlantısız Ağ Sürücüsü (Z :)" olarak görüntülendiğini göreceklerdir. Adın sizi kandırmasına izin vermeyin. Bağlantısının kesildiğini iddia edebilir, ancak herkes için işe yarayacaktır. Bu hack'in M $ tarafından desteklenmediğini bu şekilde söyleyebilirsiniz.


3
Bu çözümü kullanmaya çalışıyordum ve bu sorunla karşılaştım: eşlenen sürücü kullanıcılara (hatta yöneticilere) bağlı olarak görünüyor. Baska öneri?
Constantin Baciu

7
Yeniden başlatıldıktan sonra eşlenen sürücü kaybolur. Haritalama devam ediyor, ancak durum "Kullanılamıyor", bu yüzden görünmüyor
Tommy

4
Ayrıca yeniden başlatmanın ardından eşlemenin kullanılamadığını da görüyorum.
Dave Patterson

33
Yeniden net use z: \\servername\sharedfolderbaşlattıktan sonra çalışmasını sağlamak için, sadece içeren bir komut dosyası oluşturun ve bunu bilgisayar başlangıcında, technet.microsoft.com/en-us/library/cc770556.aspx başına çalışacak şekilde ayarlayın, bu nedenle SİSTEM hesabı olarak çalışacaktır. psexec.
TRS-80

2
Herkesin yan tümceyi kullanmasının önemli olduğunu eklemek isterim /USER:[remotecomp]\[remoteusername] [password](uzak kullanıcı adı uzak bilgisayar adı ve ters eğik çizgi ile önbelleğe alınmadığında komut bazen düzgün çalışmaz. öyle, sürücü dEĞİL herkes için erişilebilir Herhangi kullanıcıyı SİSTEMİ pay bu paylaşıma şifreyi bilmesi gerekir bağlar bu sistemin, üzerinde (XPx64 üzerinde test)..
Kitet

65

Ben psexec ile benzer bir çözüm buldum ama ek araçlar olmadan çalışır ve yeniden başlatma hayatta .

Tek bir görev ekleyin, "farklı çalıştır" alanına "sistem" yazın ve basit komutla görevi bir toplu iş dosyasına yönlendirin

net use z: \servername\sharedfolder /persistent:yes

Sonra "sistem başlangıcında çalıştır" ı seçin (veya benzer, İngilizce sürümüm yok) ve işiniz bitti.


önce ne başlar? Windows hizmeti mi yoksa bu zamanlanmış görev mi? yol kullanılamıyorsa hizmetimiz başlangıçta ölür. Hizmet son başlarsa bunu yeniden oluşturmak zorunda kalırız.
Thomas

1
Bunu 2008 R2'de denedim, Bağlantısı Kesilmiş Eşlenmiş Sürücü oluşturur ve aynısını açmaya çalıştığımda "z: \ erişilebilir değil. Oturum Açma Hatası: bilinmeyen kullanıcı adı veya hatalı parola" yazıyor. Ancak aynı yarasa dosyasını manuel olarak çalıştırarak eşlenen sürücüyü başarıyla oluşturabildim. Ny sezgileri?
Gopi

1
@Thomas, görevin ilk önce en az bir kez çalıştırılmasını sağlayarak hangisinin başladığı önemli değil/persistent:yes
Edd

4
Neden zamanlanmış bir görev olması gerekiyor? Kalıcı / kalıcı: evet, etrafta tutmak için yeterli değil mi?
Scott Stafford

2
@ScottStafford Hayır / kalıcı: Evet, Win7 ve sonraki sürümlerde yeterli değildir. Eşleme bu anahtardan bağımsız olarak yeniden başlatıldıktan sonra kaldırılır.
Ebedi21

44

Daha iyi bir yol mklink.exe kullanarak sembolik bir bağlantı kullanmak olacaktır. Dosya sisteminde herhangi bir uygulamanın kullanabileceği bir bağlantı oluşturabilirsiniz. Bkz. Http://en.wikipedia.org/wiki/NTFS_symbolic_link .


Çok basit ve iyi çalışıyor. Dosya sisteminin bir parçası olduğundan, bağlantı tüm hesaplar tarafından kullanılabilir. Hizmetin ağ kaynağına erişimi olan bir hesap olarak çalıştığından emin olun (Sistem vb. İçin geçerli olmayabilir).
Jeremy Frank

1
Bu kesinlikle soruya daha iyi cevap, çok teşekkür ederim!
Sten Petrov

3
Ne yazık ki sym bağlantısı bir ağ paylaşımına
erişirse

23

Burada iyi bir cevap var: https://superuser.com/a/651015/299678

Yani sembolik bir bağlantı kullanabilirsiniz, örn.

mklink /D C:\myLink \\127.0.0.1\c$

1
Hizmet içinden bir izin hatası oluşturmaya çalıştıktan sonra alırsanız ne olur?
tyoc213

Bu çevrimdışını bir sohbet odasına götürmeli ve ardından hata mesajının ayrıntılarını vermelisiniz. Muhtemelen komutları yükseltilmiş izinlerle çalıştırmanız gerekir.
philu

@ tyoc213 Bir cevap aldınız mı?
Lsakurifaisu

9

Bize 'net use' komutunu kullanabilirsiniz:

var p = System.Diagnostics.Process.Start("net.exe", "use K: \\\\Server\\path");
var isCompleted = p.WaitForExit(5000);

Bu bir hizmette çalışmazsa, Winapi ve PInvoke WNetAddConnection2'yi deneyin

Edit: Açıkçası ben yanlış anladım - hizmetin kaynak kodunu değiştiremezsiniz, değil mi? Bu durumda, mdb ile öneriyi takip ederdim , ancak biraz bükülme ile: Sürücüyü eşleyen ve bu eşleme hizmetini ilk (gerçek çalışma) hizmetinin bağımlılıklarına ekleyen kendi hizmetinizi oluşturun (eşleme hizmeti diyelim). Bu şekilde, çalışma hizmeti, eşleme hizmeti başlamadan (ve sürücüyü eşlemeden) başlamaz.


Bu eşleme hizmeti kurulumu ile, eşleme hizmeti tarafından oluşturulan sürücü eşlemenin orijinal hizmet bağlamında kullanılamayacağını düşünüyorum, değil mi?
VoidPointer

Bence <dclaim> </disclaim> - her winlogon oturumu için sadece bir ortam var.
Treb

Kodunuz bir hizmette ÇALIŞIR. Buraya OP ile aynı konuyla geldim ama Hizmetin yazarıyım. Cevabınız sorunumu çözdü.
Joe Gayetty

5

ForcePush,

NOT : Yeni oluşturulan eşlenen sürücü artık bu sistemin TÜM kullanıcıları için görünecek, ancak "Bağlantısız Ağ Sürücüsü (Z :)" olarak görüntülendiğini göreceklerdir. Adın sizi kandırmasına izin vermeyin. Bağlantısının kesildiğini iddia edebilir, ancak herkes için işe yarayacaktır. Bu hack'in M $ tarafından desteklenmediğini bu şekilde anlayabilirsiniz ...

Her şey paylaşım izinlerine bağlıdır. Paylaşım izinlerinde Herkes varsa, bu eşlenen sürücüye diğer kullanıcılar tarafından erişilebilir. Ancak, yalnızca toplu iş komut dosyanızda kullandığınız belirli bir kullanıcınız varsa ve bu toplu iş komut dosyası Başlangıç ​​komut dosyalarına eklenmişse, bu paylaşıma yalnızca Sistem hesabı Yönetici bile değil erişebilir. Dolayısıyla, örneğin, zamanlanmış bir ntbackuo işi kullanıyorsanız, 'Farklı çalıştır' bölümünde Sistem hesabı kullanılmalıdır. Hizmetinizin 'Farklı oturum aç: Yerel Sistem hesabı' varsa, çalışmalıdır.

Yaptığım şey , başlangıç ​​komut dosyamda herhangi bir sürücü harfini eşleştirmedim, sadece net use \\\server\share ...planlanan işlerimde UNC yolunu kullandım ve kullandım. Bir oturum açma komut dosyası ekledik (veya başlangıç ​​klasörüne yalnızca bir toplu iş dosyası ekleyelim), bazı sürücü harfleriyle aynı paylaşıma eşleme: net use Z: \\\...aynı kimlik bilgileriyle. Artık oturum açan kullanıcı bu eşlenen sürücüyü görebilir ve ona erişebilir. Aynı paylaşıma 2 bağlantı var. Bu durumda kullanıcı sinir bozucu "Bağlantısı kesilmiş ağ sürücüsü ..." ifadesini görmez. Ancak, bu paylaşıma gerçekten yalnızca UNC tarafından değil, sürücü harfiyle erişmeniz gerekiyorsa, bunu farklı sürücü harfleriyle paylaşın, örneğin Sistem için Y ve kullanıcılar için Z.


4

Windows Service'e Ağ Sürücüsüne erişim izni vermenin bir yolunu buldu.

NFS Diskli Windows Server 2012'yi ele alalım örneğin:

Adım 1: Bağlanacak bir Toplu İş Dosyası yazın.

Bir toplu iş dosyası yazın, örn: C: \ mount_nfs.bat

echo %time% >> c:\mount_nfs_log.txt
net use Z: \\{your ip}\{netdisk folder}\ >> C:\mount_nfs_log.txt 2>&1

Adım 2: Diski NT AUTHORITY / SYSTEM olarak monte edin.

"Görev Zamanlayıcı" yı açın, yeni bir görev oluşturun:

  1. "Sistem Başlangıcı" nda "SİSTEM" olarak çalıştırın.
  2. Eylem oluştur: "C: \ mount_nfs.bat" komutunu çalıştırın.

Bu iki basit adımdan sonra, "Yerel Sistem" ayrıcalığı altında çalışan Windows ActiveMQ Hizmetim giriş yapmadan mükemmel performans gösterir.


3

Normalde komut isteminden çalıştırılabilir dosyayı çalıştırdığınızda sürücüye erişebilmenizin nedeni, normal exe olarak çalıştırdığınızda, o uygulamayı oturum açtığınız Kullanıcı hesabında çalıştırmanızdır. Ve bu kullanıcının ağa erişim ayrıcalıkları vardır. Ancak, yürütülebilir dosyayı bir hizmet olarak yüklediğinizde, varsayılan olarak görevin yönetiminde gördüğünüzde 'SYSTEM' hesabı altında çalışır. Ayrıca, "SİSTEM" in ağ kaynaklarına erişim hakları olmadığını da biliyor olabilirsiniz.

Bu sorunun iki çözümü olabilir.

  1. Sürücüyü yukarıda işaret edildiği kadar kalıcı olarak eşlemek için.

  2. İzlenebilecek bir yaklaşım daha var. Hizmet yöneticisini 'services.msc' yazarak açarsanız, hizmetinize gidebilirsiniz ve hizmetinizin özelliklerinde, hesabı 'Sistem' dışında herhangi bir hesap olarak belirtebileceğiniz bir oturum açma sekmesi vardır. hizmeti kendi oturum açmış kullanıcı hesabınızdan veya 'Ağ Hizmeti' üzerinden başlatın. Bunu yaptığınızda .. hizmet kalıcı olmasa bile herhangi bir ağ bileşenine ve sürücüye erişebilir. Programlı olarak bunu başarmak için http://msdn.microsoft.com/en-us/library/ms682450(v=vs.85).aspx adresindeki 'CreateService' işlevine bakabilir ve 'lpServiceStartName' parametresini 'NT' olarak ayarlayabilirsiniz. OTORİTE \ networkservice'. Bu, hizmetinizi 'Ağ Hizmeti' altında başlatacaktır

  3. CreateService () işlevinizin servicetype parametre bayrağında SERVICE_INTERACTIVE_PROCESS belirterek hizmeti etkileşimli olarak da deneyebilirsiniz, ancak bu yalnızca Vista ve 7 donot bu özelliği destekleyene kadar sınırlı olacaktır.

Umarım çözümler size yardımcı olur .. Bunun sizin için işe yarayıp yaramadığını bana bildirin.


1

Hizmetin altında çalıştığı kullanıcıyı "Sistem" den değiştirmek veya eşlemenizi Sistem olarak çalıştırmak için gizli bir yol bulmak istemezsiniz.

Komik olan, bunun "at" komutunu kullanarak mümkün olması , sürücü eşlemenizi geleceğe bir dakika olarak planlamanız ve sürücüyü hizmetinize görünür kılması için Sistem hesabı altında çalıştırılmasıdır.


hizmet "Sistem" olarak çalışmaz. Belirli bir yerel hesap altında çalışacak şekilde ayarlanmıştır. Bu hesapla oturum açsam, kalıcı bir ağ eşlemesi oluşturmam, oturumu kapatıp hizmeti yeniden başlatmam bile, eşleme hizmet tarafından kullanılamaz.
VoidPointer

1

Kalıcı bir sürücüye güvenmek yerine, komut dosyasını sürücüyü her kullandığınızda eşlemek / eşlemesini kaldırmak için ayarlayabilirsiniz:

net use Q: \\share.domain.com\share 
forfiles /p Q:\myfolder /s /m *.txt /d -0 /c "cmd /c del @path"
net use Q: /delete

Bu benim için çalışıyor.


0

Henüz yorum yapamıyorum (itibar üzerinde çalışıyorum) ama sadece @Tech Jerk @ spankmaster79 (güzel isim lol) ve @NMC sorunlarını yanıtlamak için bir hesap oluşturdum. psexec ancak ek araçlar olmadan çalışır ve yeniden başlatmadan sağ kalır. " post @Larry yapmıştı.

Bunun çözümü, oturum açmış olan hesaptan o klasöre göz atmaktır, yani:

    \\servername\share  

ve giriş yapmasına izin verin ve UNC için kullandığınız kimlik bilgilerini psexec'te girin. Bundan sonra çalışmaya başlar. Benim durumumda, bunun, hizmete sahip sunucunun eşleştirdiğim sunucuyla aynı etki alanının üyesi olmaması nedeniyle olduğunu düşünüyorum. UNC ve zamanlanan görevin her ikisi de ana bilgisayar adı yerine IP'ye başvuruyorsa düşünüyorum

    \\123.456.789.012\share 

sorunu tamamen önleyebilir.

Burada yeterince rep puanı alırsam, bunun yerine cevap olarak ekleyeceğim.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.