1

Konu: run as komutunu VFP'de API ile yazmak

Merhaba,

Başlık tuhaf oldu ama başka söz bulamadım. Mesaj da uzun, kusura bakmayın.

Ağ ortamında kullanılmak üzere VFP'de yazdığım program uzunca bir süredir kullanılıyor.
Tipik bir düzen var.  Terminallerde EXE ve dll'ler var, esas tablolar ise Windows Server 2003 yüklü bir makinada.
Terminallerden sunucuya ulaşmak için Run As benzeri bir fonksiyon sağlayan Runasspc.exe adlı bir program kullanıyorum.
Bunun için bir bat dosyası oluşturdum ve kısayolu masaüstünde. Kullanıcılar bunu çalıştırıyor. içeriği şöyle:
@ECHO OFF
runasspc /program:"c:\cbpat\cbpat.exe" /domain:"localhost" /user:"cbpat" /password:"1234" /logon:netonly /quiet

Böylelikle sunucuda oluşturduğum cbpat adlı kullanıcıve 1234 şifresiyle esas tablolara erişebiliyor. Buradaki netonly bu kimlik bilgilerini yalnızca network erişimlerinde kullanmasını sağlamak için. Yerel dosyalara erişim için bu kimlik bilgileri kullanılmıyor.
runasspc ile network kaynağı korunmuş oluyor.
cbpat.exe benim VFP'de yazdığım program.

İlk sorum şu; runasspc kullanan var mı? Ya da arkadaşlar yerine ne kullanıyor?

İkinci sorum da; ana bilgisayarda değişiklik yapılacak benim de bat dosyasındaki bilgileri değiştirilebilir kılmam istendi.
Yani yine VFP'de ek birşeyler yazıp anabilgisayarın adını, erişim için kullanıcı adı ve psw'yi bir dbf'ye kaydeden ve gerektiğinde edit edilebilecek bir setup benzeri bir program yazmam gerek. Bunun için Windows'un API'sini kullanan bir kod buldum. Üzerinde epey çalışıp düzenledim. İşi yapıyor ancak network printerlarına erişimde sorun çıkarıyor. Kod şöyle:

Visual Fox Pro
PROCEDURE ChangeUser

LPARAMETERS lpUser,lpPassword
DECLARE integer LogonUser IN AdvApi32.DLL string szUsername, string lpszDomain,string lpszPassword,;
integer dwLogonType,integer dwLogonProvider,integer @phToken
DECLARE integer ImpersonateLoggedOnUser IN AdvApi32.DLL integer hToken
LOCAL nToken
nToken=0
LogonUser(lpUser,"localhost",lpPassword,9,3,@nToken)
ImpersonateLoggedOnUser(nToken)
CLEAR DLLS
ENDPROC

Bu durumda başka çözümler aradım. runasspc.exe'nin yine Windows API'sindeki CreateProcessWithLogonW fonksiyonunu kullandığını anladım. Bu fonksiyonu kullanan örnek kodların hepsi sorunlu. Bu konuda yardım rica ediyorum.

İyi günler...

2

Re: run as komutunu VFP'de API ile yazmak

Microsoft un uzman kullanıcılar için Sysinternal suit i var.

İşine yarıycak bir çok fonksiyon bulacağından eminim.

https://technet.microsoft.com/en-us/sysinternals/bb842062

Uğur
-------------------------------------------------------------------------------------------------------------
Hayat bir bisiklete binmek gibidir. Pedalı çevirmeye devam ettiğiniz sürece düşmezsiniz. Claude Peppeer
Kusuru söylenmeyen adam, ayıbını hüner sanır.  Türk Atasözü

3

Re: run as komutunu VFP'de API ile yazmak

İlginiz için teşekkür ederim.

Ne yazık ki orada da runasspc ile aynı fonksiyonları olan bir utility program var.

Ancak benim ihtiyacımı tam olarak karşılamıyor.

CreateProcessWithLogonW fonksiyonunun VFP'de yazılmış çalışır bir programını arıyorum.

4

Re: run as komutunu VFP'de API ile yazmak

Yazdığım bir program işletim sistemin baya derinlerine dalıyor ve bu nedenle bazı bölümlerde geçici olarak UAC en düşük seviyede çekmek zorunda kalıyor.
Bazı müşterilerde ama kullanıcılar admin hakkına sahip olmadan çalışdığı için, program düzgün çalışamiyordu.

"runasspc" ile bu olmamışdı. Nedeni hatırlamiyorum. Buna benzer bir program daha vardı. Ama onlada bir yerlere varamdım.
Bunun üzerine autoit ile kendime bir program yazdım. Daha doğrusu 2 tane yazmak zorunda kaldım: biri 32bit, diğeri 64bit.
start32.exe ve start64.exe

Mantık şöyle:
Vfp programın içinde bir bölümde admin şifresini belirtme yeri var. Bu admin şifresini şifrelenmiş bir şekilde bir ini-dosyasına kayıt ediliyorum.
Vfp çalışdığında ilk aşamada parametresiz çalışdığı için, vpf-program start32.exe'yi çalıştırıyor ve kendisini sonlandırıyor.

start32.exe gidiyor ini-dosyadaki admin şifresi okuyor, deşifre ediyor ve vfp programını dummy bir parametre ile tekrar çalıştırıyor. Ama bunu windows'un kendi runas komutu ile yapıyorum. Böyle sorunumu çözebildim.

Bu işini görürmü?

Bir projenin bitmesi için 3 seçenek vardır: hızlı, ucuz, iyi. Bu seçeneklerden iki tanesini seçiniz.

5

Re: run as komutunu VFP'de API ile yazmak

İlginç bir çözüm.

autoit ile deneyimim yok. Benim serverın adı/adresi, kullanıc adı ve şifreyi bir dbf yi kaydetmem gerek.

Teşekkürler

6

Re: run as komutunu VFP'de API ile yazmak

Sorunu çözdüm.
İlgilenen arkadaşlara teşekkür ederim.

Almanca bir sitede bulduğum kod üzerinde biraz çalıştım ve runas fonksiyonunu VFP'de yazmış oldum. Bende ağ üzerinde domain olmadığı için parametre olmaktan çıkardım ve sabit olarak "localhost" değeri verdim. Arkadaşlara yararı olabilir düşüncesiyle kodu aşağıda veriyorum.

Visual Fox Pro
cAppName="c:\myapp.exe"

FUNCTION YeniKullanici
    LPARAMETERS cUser,cPass
    LOCAL lpStartupInfo as String, lpProcessInfo as String
    LOCAL lx
    DECLARE integer GetLastError in kernel32
    DECLARE INTEGER CreateProcessWithLogonW IN Advapi32;
    STRING lpUsername,STRING lpDomain,STRING lpPassword,INTEGER dwLogonFlags,STRING lpAppName,STRING lpCmdLine, ;
    INTEGER dwCreationFlags,INTEGER lpEnvir,STRING lpCurDir,STRING @ lpStartupInfo, STRING @ lpProcessInfo
    DECLARE integer CloseHandle in kernel32.dll integer hToken
    cUser=STRCONV(cUser+CHR(0),5)
    cDomain=STRCONV("localhost"+CHR(0),5)
    cPass=STRCONV(cPass+CHR(0),5)
    cCommandLine=STRCONV(" "+CHR(0),5)
    cDir=STRCONV(justpath(m.cAppName)+CHR(0),5)
    cAppName=STRCONV(m.cAppName+CHR(0),5)
    cStartInfo=PADR(CHR(68),68,CHR(0))
    pProc=REPLICATE(CHR(0),16)
    lx=CreateProcessWithLogonW(cUser,cDomain,cPass,0x2,cAppName,cCommandLine,0x4000000,0,cDir,@cStartInfo,@pProc)
    if lx=0
        MESSAGEBOX("HATA OLUŞTU! HATA NUMARASI : " + ALLTRIM(STR(GetLastError())),16,"")
    ELSE
        hProcess=buf2dword(substr(pProc, 1,4))
        hThread=buf2dword(substr(pProc, 5,4))
        CloseHandle(hThread)
        CloseHandle(hProcess)
    ENDIF
    CLEAR DLLS
ENDFUNC
**********
FUNCTION buf2dword (lcBuffer)
    RETURN;
    Asc(SUBSTR(lcBuffer, 1,1)) + ;
    Asc(SUBSTR(lcBuffer, 2,1)) * 256 +;
    Asc(SUBSTR(lcBuffer, 3,1)) * 65536 +;
    Asc(SUBSTR(lcBuffer, 4,1)) * 16777216
ENDFUNC

7

Re: run as komutunu VFP'de API ile yazmak

Teşekkürler Kandilzade ... Arşivime   ekledim bile smile

Uğur
-------------------------------------------------------------------------------------------------------------
Hayat bir bisiklete binmek gibidir. Pedalı çevirmeye devam ettiğiniz sürece düşmezsiniz. Claude Peppeer
Kusuru söylenmeyen adam, ayıbını hüner sanır.  Türk Atasözü